环境变量用于定义Shell的运行环境,保证Shell命令的正确执行,Shell通过环境变量来确定登录用户名、命令路径、终端类型、登录目录等,所有的环境变量都是系统全局变量,可用于所有子进程中,这包括编辑器、Shell脚本和各类应用,不像本地变量(只用于现在的Shell)。
环境变量可以在命令行中设置,但用户退出时这些变量值也会丢失,因此最好在用户家目录下的.bash_profile文件中或全局配置/etc/profile文件或者/etc/profile.d/中定义。将环境变量放入profile文件中,每次用户登录时这些变量值都将会被初始化。
环境变量可用在创建他们的shell和从该shell派生的任意子shell或者进程中。他们通常被称作全局变量以区别局部变量。通常,环境变量应该大写。环境变量是已经用export内置命令导出的变量。
自定义环境变量(全局变量)
格式:
1、export 变量名=value
2、变量名=value ; export 变量名
3、declare –x 变量名=value
以上为三种设置环境变量的方法
unset 环境变量 取消环境变量
set 查看环境变量
env 查看环境变量
局部变量:
本地变量在用户当前shell生存期的脚本中使用。例如:本地变量a取值为b,这个值只在用户当前shell生存期中有意义。如果在shell中启动另一个进程或退出,本地变量a的值将无效。
1、普通字符串变量定义
变量名=value
变量名=‘value’
变量名=“value”
例:
1 2 3 4 5 6 7 8 |
<strong>[root@localhost shell]# vi mm.sh</strong> 1 #!/bin/bash 2 a=192.168.1.2 3 b='192.168.1.2' 4 c="192.168.1.2" 5 echo "a=$a" 6 echo "b=$b" 7 echo "c=$c" |
1 2 3 4 |
<strong>[root@localhost shell]# . mm.sh a=192.168.1.2 b=192.168.1.2 c=192.168.1.2</strong> |
例2:
1 2 3 4 5 6 7 8 |
<strong>[root@localhost shell]# vi mm.sh </strong> 1 #!/bin/bash 2 a=192.168.1.2-$a 3 b='192.168.1.2-$a' 4 c="192.168.1.2-$a" 5 echo "a=$a" 6 echo "b=$b" 7 echo "c=$c" |
1 2 3 4 |
<strong>[root@localhost shell]# . mm.sh a=192.168.1.2-192.168.1.2 b=192.168.1.2-$a c=192.168.1.2-192.168.1.2-192.168.1.2</strong> |
有关单引号、双引号与不加引号的简要说明如下:
单引号:
可以说是所见即所得:即将单引号内的内容原样输出,或者描述为单引号里面看到的是什么就会输出什么。
双引号:
把双引号内的内容输出出来;如果内容中有命令、变量等,会先把变量、命令解析出结果,然后再输出最终内容来。
无引号:
把内容输出出来,会将含有空格的字符串视为一个整体输出,如果内容中有命令、变量等,会先把变量、命令解析出结果,然后再输出最终内容来,如果字符串中带有空格等特殊字符,则不能完整的输出,需要改加双引号,一般连续的字符串,数字,路径等可以不加任何引号,不过最好用双引号替代。
例:
1 2 3 4 5 6 7 8 9 |
<strong>[root@localhost shell]# date1="today is `date`" [root@localhost shell]# date2='today is `date`' [root@localhost shell]# date3=today is `date` -bash: is: command not found [root@localhost shell]# echo $date1 today is 2014年 03月 19日 星期三 08:05:15 CST [root@localhost shell]# echo $date2 today is `date` </strong><strong>[root@localhost shell]# echo $date3</strong> |
结论:
无论定义变量还是输出变量,单引号,双引号,无引号的情况都和上面的说明一致的。
自定义变量的建议:
1)、纯数字,或简单字符串(不带空格),定义方式可以不加引号(单或双),例如:
a.m=33
b.m=yes
2)、没特殊情况,字条串一般用双引号定义,特别是多个字条串中间有空格时,例如:
m=”no load”
3)、变量内容需要原样输出时,要用单引号(‘ ’)
m=’date’
变量的命名规范
1) 变量命名要统一,使用全部大写字母,如APACHE_ERR_NUM;语义要清晰,能够正确的表达变量的含义,过长的英文单词可采用前几个字符代替。多个单词连接使用“_”号连接,引用时,最好以${APACHE_ERR_NUM}加大括号或”${APACHE_ERR_NUM”外面 加双引号方式引用变量,如果追求简单,方便就用$APACHE_ERR_NUM。
2) 避免含义字符或数字,例如下面的COUNT,并不知道其确切含义
例1:COUNT的不确切定义
1 2 3 4 5 |
COUNT=’grep keywords file’ if [ ${COUNT} –ne 22] then echo ‘Do Something’ fi |
全局变量和局部变量命名
全局变量要一定要使用大写字母,语义要清晰,能够正确的表达变量的含义,过长的英文单词可采用前几个字符代替。多个单词连接使用“_”号连接。引用时,以${APACHE_ERR_NUM}方式或”${APACHE_ERR_NUM”方式引用。
局部变量命名:
local 变量名
总结:
1、尽量用有意义的字符串,推荐大写的方法,全部小写也可。
2、引用变量时,如果追求简单,方便就用$m,但是如果变量后面还有字符串就要用大括号把变量括起来,${m}m;
把一个命令作为变量
1 2 |
<strong>1、CMD=”`ls`” 2、CMD=$(ls)</strong> <strong><em>推荐使用 因为反引号容易当成单引号,容易丢失,不易寻找</em></strong> |
1 2 3 4 |
<strong>mkdir `seq 5` mkdir $(echo {a..f}) mkdir {a..f} mkdir $(seq 100)</strong> |