[转帖]linux bash环境变量简单总结
linux bash环境变量简单总结
来源链接:http://www.178linux.com/8005 原创文章,如有转载,请注明原文地址 需要简单学习一下. 其实 我都是直接放一个 .sh文件到 /etc/profile.d 的目录下面 感觉这样最粗暴有效 虽然也可以放 .bash_rc 或者是 .bash_profile 里面 但是 毕竟是单用户的 而且不喜欢改 profile 文件 太复杂了 改坏了很麻烦.
一.环境变量简介
Linux是一个多用户的操作系统。每个用户登录系统后,都会有一个专用的运行环境。通常每个用户默认的环境都
是相同的,这个默认环境实际上就是一组环境变量的定义。
环境变量是全局的,设置好的环境变量可以被所有当前用户所运行的程序所使用。
用户可以对自己的运行环境进行定制,其方法就是修改相应的系统环境变量。
常见的环境变量:
PATH: 决定了shell将到哪些目录中寻找命令或程序
ROOTPATH: 这个变量的功能和PATH相同,但它只罗列出超级用户(root)键入命令时所需检查的目录。
HOME: 当前用户主目录
USER: 查看当前的用户
LOGNAME: 查看当前用户的登录名。
UID: 当前用户的识别字,取值是由数位构成的字串。
SHELL: 是指当前用户用的是哪种Shell。
TERM : 终端的类型。
PWD 当前工作目录的绝对路径名,该变量的取值随cd命令的使用而变化。
MAIL: 是指当前用户的邮件存放目录。
HISTSIZE: 是指保存历史命令记录的条数
HOSTNAME: 是指主机的名称,许多应用程序如果要用到主机名的话,通常是从这个环境变量中来取得的。
PS1: 是基本提示符,对于root用户是#,对于普通用户是$,也可以使用一些更复杂的值。
PS2: 是附属提示符,默认是“>”。可以通过修改此环境变量来修改当前的命令符,比如下列命令会将提示符
修改成字符串“Hello,My NewPrompt :) ”。# PS1=" Hello,My NewPrompt :) "
IFS: 输入域分隔符。当shell读取输入时,用来分隔单词的一组字符,它们通常是空格、制表符和换行符。
语言及环境字符集相关的重要环境变量:
相关命令:
stty 显示或设定文字终端设置,主要是按键的代表意义
locale (local environment)查看当前的语系信息
【注:locale -a :查看当前系统所支持的字符集】
LANG 没有设置任何LC_XXX变量时所使用的默认值。
【LANG=zh.CN.UTF-8 gedit a.txt //临时采用其它字符集语言打开指定的应用程序】
LC_ALL 用来覆盖掉所有其他LC_XXX变量的值
LC_COLLATE 使用所指定地区的排序规则
LC_CTYPE 使用指定地区的字符集(即:字母,数字,标点符号等)
LC_MESSAGES 使用所指定地区的响应与信息;【注:仅POSIX适用】
LC_MONETARY 使用指定地区的货币格式
LC_NUMERIC 使用指定地区的数字格式
LC_TIME 使用指定地区的日期与时间格式。
不太常用的实用环境变量:
LD_LIBRARY_PATH 这个变量包含了一系列用冒号隔开的目录,动态链接器将在这些目录里查找库文件。 MANPATH 这个变量包含了一系列用冒号隔开的目录,命令man会在这些目录里搜索man页面。 【注:man帮助目录结构必须为:man/{man1,man2,..man8}, MANPATH=/man】 INFODIR 这个变量包含了一系列用冒号隔开的目录,命令info将在这些目录里搜索info页面。 PAGER 这个变量包含了浏览文件内容的程序的路径(例如less或者more)。 EDITOR 这个变量包含了修改文件内容的程序(文件编辑器)的路径(比如nano或者vi)。
系统位置变量—【仅用于shell脚本中获取命令行传递给脚本的参数】
$0、$1 $2 $3 $4 $5 $6 $7 $8 $9,$* ——>$0到9与windows中0~9的含义一样。
$0:当前执行Shell文件名
$#:命令行中位置参数的个数
$*:获取当前shell的所有参数
$@:此程序的所有参数
系统特殊变量
$?:上一条命令执行后返回的状态,当返回值为0:表执行正常,非0:执行异常或出错
程序执行,可能有两类返回值:
》0:正确执行
》1~255:错误执行。其中1,2,127 是系统预留错误代码,可自行使用
$$:当前所在进程的进程号 【$$变量最常见的用途是用做暂存文件的名字以保证暂存文件不会重复。】
$!:后台运行的最后一个进程号
$_:在此之前执行命令或脚本的最后一个参数
引号对变量赋值的影响:
》双引号“”:允许通过$符号引用其他变量值
》单引号‘’: 禁止引用其他变量值,$视为普通字符
》反撇号` `:将命令执行的结果变输出给变量 ,
$(…) :这是反撇号的另一种版本。
二.Bash(Bourne-Again Shell)简介
Bash是许多Linux平台的内定Shell,事实上,还有许多传统UNIX上用的Shell,像tcsh、csh、ash、bsh、ksh
等等。Shell Script大致都类同,当您学会一种Shell以后,其它的Shell会很快就上手。
大多数的时候,一个Shell Script通常可以在很多种Shell上使用。
通常而言,shell的功能是从终端或其它输入取得命令行,将其解析为一系列操作指令,调用系统内核或相应的
外部程序执行,然后将执行结果返回给终端或其它输出。因此,实现一个简单的shell是一项容易的工作。
但bash的功能不仅限于此,它支持用管道和重定向协同执行命令,提供了强大的脚本编程能力,
具备作业管理功能。一般的Linux发行版中,bash的可执行文件往往是/bin中最大的几个实用程序之一,
客观反映了它的复杂性。
三.Bash实现原理简介
bash使用GNU Readline库处理用户命令输入,Readline提供类似于vi或emacs的行编辑功能。
bash运行时的调度中心是其主控循环。主控循环的功能较为简单,它循环读取用户(或脚本)输入,传递给
语法分析器,同时处理下层递归返回的错误。
语法分析器对文本形式的输入首先进行通配符、别名、算术和变量展开等工作,然后通过命令生成器得到
规范的命令结构,并由专门的重定向处理机制填写重定向语义,交由命令执行器执行。命令执行器依据
命令种类不同,执行内部命令函数、外部程序或文件系统调用。在命令执行过程中,执行器要对系统信号
进行捕获和处理。在支持作业管理的操作系统中,命令执行器将进程信息加入作业控制机制,并允许用户
使用内部命令或键盘信号来启停作业。如果在不支持作业管理的操作系统中编译bash,会使用另一套接口
相同的机制对进程信息进行简单的维护。
四.Shell和环境变量的关系
环境变量是和Shell紧密相关的,环境变量是通过Shell命令来设置的。用户登录系统后就启动了一个Shell。
对于Linux来说一般是bash,但也可以重新设定或切换到其它的 Shell。
设置好的环境变量又可以被所有当前用户所运行的程序所使用。对于bash这个Shell程序来说,可以通过
变量名来访问相应的环境变量。
Linux 的环境变量具有继承性,即子shell 会继承父shell 的环境变量。
当前shell中的变量也叫本地变量,很显然本地变量中肯定包含环境变量。Linux 的本地变量的非环境变量
不具备继承性。
五、登录脚本的执行顺序:【注:仅适用于 bash shell】
Login Shell
是指登录时,需要提供用户名密码的shell,如:su – user1 , 图形登录, ctrl+alt+F2-6进入的登录界面。
这种Login shell 执行脚本的顺序:
1. /etc/profile 【全局profile文件;它定义了LoginUser的 PATH, USER, LOGNAME(登录使用者帐号)】
2. /etc/profile.d/目录下的脚本
3. ~/.bash_profile 【搜索命令的路径 ——————- 登录级别 环境变量配置文件 】
4. ~/.bashrc 【存储用户设定的别名和函数 ———- shell级别 环境变量配置文件】
5. /etc/bashrc 【全局bashrc文件; 它主要定义一些 Function 和 Alias;更改/etc/bashrc会影响到所有用户,由root用户管理。】
Non-Login shell
非登录shell指的是,不需要输入用户名密码的shell,如图形下 右键terminal,或ctrl+shift+T打开的shell
这种Non-Login shell 执行登录脚本的顺序:
1. ~/.bashrc
2. /etc/bashrc
3. /etc/profile.d/目录下的脚本
说到用户脚本就不能不说下,与用户密切相关的两个文件:
1. /etc/login.defs —– 它定义了用户密码长度,最长使用期,警告天数,密码加密方法,家目录默认权限 等。
2. /etc/default/useradd –它定义了创建用户时,默认家目录的根,默认shell,从哪里拷贝必要配置文件,是否创建邮箱等。
/etc/skel –【.bashrc, .bash_profile, .bash_logout等文件都源自这里】
当用命令添加一个用户时,它默认会在/home/下新建一个以用户名为名的目录,并把/etc/skel下的文件
copy到这个新用户的家目录中。这样当该用户登录时,系统会自动调用这些文件,配置该用户的登录环境。
六. 环境变量的应用 和 操作:
1.变量内容的删除和替换
${变量#关键词} 从头开始检查关键词,将符合的最短数据删除
${变量##关键词} 从头开始检查关键词,将符合的最长数据删除
${变量%关键词} 从尾开始检查关键词,将符合的最短数据删除
${变量%%关键词} 从尾开始检查关键词,将符合的最长数据删除
${变量/旧字符串/新字符串} 若符合旧字符串,则第一个旧字符串被替换
${变量//旧字符串/新字符串} 若符合旧字符串,则全部旧字符串被替换
2. 变量内容的设定和替换
一次变量置换:
变量没有值:
echo ${a:=abc} //若a没有值,就送给a一个abc,作为它的值,这时a的值就永久是abc了,直到下次修改。
//下面例子不常用
echo ${a:?必须需要给变量一个值} //若a没有值,则提示"必须需要给变量一个值"
echo ${a:-abc} //若a没有值,就借给a一个值,次命令执行完后,a还是空值。
变量有值
echo ${a:+123} //临时替换变量的值; a=1; expr ${a:+123} – 1;其值为122
二次变量置换
示例一:
A=B
a=1
B1="B值"
eval echo \$$A$a > B1.txt //注意:这里不能直接用反撇号获取二次置换的结果。
C=`cat B1.txt` //如此就可以获取B1的变量值了.
示例二:
FAIL="echo -e \"\n\e[31m\${FMSG}\e[0m\n\""
FMSG="需要红色提示显示的字符串。" && eval ${FAIL}
示例三:
grep的结果:"APPDIR="/home/abc/bin“" 通过eval可以直接将APPDIR转换为赋值语句执行。
eval `grep '^ .*APPDIR' /etc/tuxconfig`
echo ${APPDIR} //这样就可以输出APPDIR的值。
七.一些Shell内置命令
1.source命令
作用:在当前bash环境下读取并执行FileName中的命令,使环境变量生效。
注:该命令通常用命令“.”来替代。
例如:
source ~/.bash_profile
2.export :
用于把变量变成当前shell和其子shell的环境变量,存活期是当前的shell及其子shell,因此重新登陆或者关闭当前
shell及其子shell后,它所设定的环境变量就消失了。
3.env和printenv
这两个变量用于打印所有的环境 变量:
4.set
用于显示与设置当前本地 变量。单独一个set 就显示了当前环境的所有的变量,它肯定包括环境变量和一些非环境变量
5.unset 用于清除变量。不管这个变量是环境变量还是本地变量,它都可以清除。
八.其它与变量相关的小知识
shell : 属于弱类型语言,变量可直接使用,不需要声明和初始化。
对于强类型语言,则必须在使用变量前先声明,甚至需要初始化,因为变量不初始化其值为随机数。
变量: 它是内存空间的一个别名,这个别名映射的是内存的存储单元的编址。
数组:是一个命名的连续的内存空间
Shell的变量类型: 是事先确定数据的存储格式和长度。
字符: 是按照ASCII存储;一个字符串10,是存储为两个ASCII码,占16bit。
数值:
1.整型: 如10,它存储时,是转为二进制1010,占4bit,实际占8bit.
2.浮点型: “11.23”,它在存储时,是会转为两部分存放,
一般为数值和小数点位置,如11.23–>0.1123*10^2,存储时仅存1123和次方数2.
如:2014/11/11在存放时,它是若按字符串存64bit.
如按数值存则采用2014/11/11 – 1977/1/1 = N, 它若存N这个数值,需要的空间最多24bit.
变量溢出:
一个整型是8bit,可存放的值有256个,范围是0-255,但若一个整型中存放了256,最怎样?结果就是变量溢出,
8bit中存的是全0,1溢出了,溢出之后1被存放到其它程序的存储空间中了,它可能覆盖其它程序的数据。
这看上去没有任何意义,但若是一个设计精良的溢出值,则可能会因此覆盖掉某些程序的一部分内存空间
从而轻易的获取该程序的控制权,若该程序是系统进程,则它将可能获取系统权限
shell中数组相关操作: —【注:shell中的数组不能做为export导出的对象,因此它仅不能作为环境变量】
变量名=(Value1 Value2 Value3 Value4)
a=(1 2 3 4 5)
例子:
Cpu(s): 1.0%us, 0.5%sy, 0.0%ni, 98.5%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
a=(`top -n5 -d1 | awk '$1~/Cpu\(s\):/{print $2}' | awk -F'%' '{print $1}' | xargs -n5`)
查数组成员数
echo ${#a[*]} —>前面加“#”,表示查看数组有多少个成员
查看成员值
echo ${a[0]} —>第一个数组成员的值为 1.
echo ${a[*]} 或 echo ${a[@]} —>查看所以成员的值
declare -p a —>查看所有数组成员。
echo ${a[*]:1:3} —>查看数组中下标为1~3的成员值
[转帖]linux bash环境变量简单总结的更多相关文章
- linux bash环境变量简单总结
来源链接:http://www.178linux.com/8005 原创文章,如有转载,请注明原文地址 一.环境变量简介 Linux是一个多用户的操作系统.每个用户登录系统后,都会有一个专用的运行环境 ...
- 第二十一篇 Linux中的环境变量简单介绍
环境变量之 PATH 定义解释器搜索用户执行命令的路径 获取PATH变量的值: echo $PATH /usr/local/bin:/usr/local/sbin:/usr/bin:/us ...
- Linux中环境变量文件及配置
Linux中环境变量文件及配置 一.环境变量文件介绍 转自:http://blog.csdn.net/cscmaker/article/details/7261921 Linux中环境变量包括系统 ...
- Linux中环境变量文件及配置(转载)
一.环境变量文件介绍 转自:http://blog.csdn.net/cscmaker/article/details/7261921 Linux中环境变量包括系统级和用户级,系统级的环境变量是每个登 ...
- Linux下环境变量设置 (转)
Linux下环境变量设置 1.在Windows 系统下,很多软件安装都需要配置环境变量,比如 安装 jdk ,如果不配置环境变量,在非软件安装的目录下运行javac 命令,将会报告找不到文件,类似的错 ...
- Linux中环境变量的设置
目录 环境变量 Shell定义的环境变量 查看环境变量 Linux下环境变量的设置 环境变量 在Windows 系统下,很多软件安装都需要配置环境变量,比如 安装 jdk ,如果不配置环境变量,在非软 ...
- Linux SHELL,环境变量
SHELL: 在计算机科学中,Shell俗称壳(用来区别于核),是指"提供使用者使用界面"的软件(命令解析器).它类似于DOS下的command和后来的cmd.exe.它接收用户命 ...
- Linux设置环境变量小结:设置永久变量&临时变量 全局变量&局部变量
1.总结背景 在linux系统下,如果你下载并安装了应用程序,很有可能在键入它的名称时出现“command not found”的提示内容.如果每次都到安装目标文件夹内,找到可执行文件来进行操作就太繁 ...
- Linux:环境变量
环境变量 变量 变量定义:declare tmp,declare是可选的. 变量赋值:tmp=1,=号左右不要有空格. 变量引用:echo $tmp,不要忘记了$号. 环境变量 简单理解了变量的概念, ...
随机推荐
- 【原创】go语言学习(三)字符串串、时间和日期类型
目录 1.字符串串原理理解析2. 时间类型3. 日期类型 字符串串原理理解析 1.字符串串底层就是⼀一个byte数组,所以可以和[]byte类型互相转换2.字符串串之中的字符是不不能修改的,那怎么修改 ...
- python对象调用父类的方法
#类定义 class People: #定义基本属性 name = '' age = 0 #定义私有属性,私有属性在类外部无法直接进行访问 __weight = 0 #定义构造方法 def __ini ...
- 怎么写一个带 bin 的 npm 包
只需要2步: 1. 在package.json 定义 一下 : { "name": "my-cli", ..., "bin": { &quo ...
- python 的单例
例子 class Singleton(object): _instance = None def __new__(cls, *args, **kw): if not cls._instance: cl ...
- Atcoder ABC 141
Atcoder ABC 141 A - Weather Prediction SB题啊,不讲. #include<iostream> #include<cstdio> #inc ...
- cmake入门之内部构建
https://www.cnblogs.com/coderfenghc/tag/cmake/ https://cmake.org/cmake/help/v3.16/guide/tutorial/ind ...
- 三行代码CSS竖向居中
.element{ position:relative; top:50%; transform:translateY(-50%); } 这里无需设置高度或者父元素的position属性.(IE9可用) ...
- pc电源cpu插座和显卡插座
cpu插座是8口的,一般4+4 显卡插座是6口的,也有8口的用6+2 6+2的中2有一个小边,组合成8口也不能插入cpu插座.
- C语言联合
联合使用关键字union,表示的一种量,只占用一块内存,具体如何占用取决于类型最大的那个.比如int和float会选用float. 联合也可以和结构体结合起来用,也可以赋值,通过.属性名的方式指定初始 ...
- OpenResty之 limit.count 模块
原文: lua-resty-limit-traffic/lib/resty/limit/count.md 1. 示例 http { lua_shared_dict my_limit_count_sto ...