环境变量也称为全局变量,能够在建立他们的Shell及其派生出来的任意子进程Shell中使用,环境变量又能够分为自定义环境变量和bash内置的环境变量,环境变量能够在命令行中设置和建立,用户退出命令行时这些变量值就会丢失,想要永久保存环境变量,可在用户家目录下的. bash_profile或. bashrc(非用户登陆模式特有,如:SSH)文件中,或在/etc/profile文件中定义,这样每次用户登陆时这些变量都将被初始化。bash
普通变量也可成为局部变量,只能在建立它们的Shell函数或Shell脚本中使用,普通变量通常由开发者在开发脚本程序时建立,网络
set命令输出全部的变量,包括全局变量和局部变量app
1 [root@king ~]# set
2 APACHEERR=hello world 3 BASH=/bin/bash 4 BASH_ALIASES=() 5 BASH_ARGC=() 6 BASH_ARGV=() 7 BASH_CMDS=() 8 BASH_LINENO=() 9 BASH_SOURCE=() 10 BASH_VERSINFO=([0]="4" [1]="1" [2]="2" [3]="1"
11 中间和结尾省略若干代码
env(printenv)命令只显示全局变量,ssh
1 [king@king~]$ env 2 HOSTNAME=king 3 SHELL=/bin/bash #你们能够自行查看一下哦
declare命令输出全部的变量,函数,整数,和已经导出的变量,set -o命令显示bashShell的全部参数配置信息函数
若是想设置环境变量,就要给在给变量赋值后或在设置变量时使用export命令,export命令和declare命令的格式:学习
小试牛刀:定义环境变量并赋值的方法:测试
1 [root@king script]# cat /etc/profile|grep qzl 2 export qzl='qzlking' #<==编辑/etc/profile,而后输出此行并保存 3 [root@king script]# source /etc/profile #<==或./etc/profile使其生效 4 [root@king script]# echo $qzl #<==在变量前加$符号并打印变量值 5 qzlking 6 [root@king script]# env|grep qzl #<==查看定义结果 7 qzl=qzlking
咱们一块儿来看一下让环境变量永久生效的经常使用配置文件ui
a)用户环境变量配置spa
1 [root@king scripts]# ls /root/.bashrc 2 /root/.bashrc 3 [root@king scripts]# ls /root/.bash_profile 4 /root/.bash_profile
说明:对于用户的环境变量设置,常见的是用户家目录下的.bashrc和.bash_profile。命令行
b)全局环境变量的配置
常见的全局环境变量配置文件,/etc/profile;/etc/bashrc;/etc/profile.d这三个配置文件,若是想要在登录后初始化或者显示加载的内容,只须要把脚本文件放在/etc/profile.d文件下便可(不须要加执行权限)。
在Java环境中,自定义环境变量,一般放在/etc/profile全局环境变量里哦,
1 export JAVA_HOME=/application/jdk 2 export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib 3 export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH:$HOME/bin 4 export RESIN_HOME=/application/resin
咱们一般在工做中要查看一下环境变量中都配置了什么,须要作什么更改,因此咱们就有了ehco或printf命令来打印查看环境变量。
1 [king@king ~]$ echo $HOME 2 /home/king 3 [king@king ~]$ echo $UID 4 300
咱们能够用unset来消除本地变量和环境变量
1 [king@king ~]$ echo $USER 2 nane 3 [king@king ~]$ unset $USER 4 [king@king ~]$ echo $USER #<这里输出是个空行 5
小结:
用户登陆系统后首先会加载/etc/profile全局环境变量文件,加载完后,执行/etc/profile.d目录下的脚本文件(如:系统的字符集设置/etc/sysconfigil8n),而后在运行$HOME/.bash_profile(用户环境变量文件),在这文件里会找$HOME/.bashrc(用户环境变量文件),有就执行,没有就不执行。在$HOME/.bashrc找/etc/bashrc(全局环境变量文件)有就执行,没有就不执行。若是但愿用户的Shell不是登录时启动的(如:手动敲下bash时启动或者远程ssh链接状况),非登录Shell只会加载$HOME/.bashrc(用户环境变量文件),并会去找/etc/bashrc(全局环境变量文件)。即非登录Shell想读到设置的环境变量,须要将变量设定等写入$HOME/.bashrc(用户环境变量文件)或etc/bashrc(全局环境变量文件)不是$HOME/.bash_profile或/etc/profile。。。
1)普通变量的定义,有三种写法
2)命令结果做为的变量内容来赋值
变量定定义示例:
1 KingAge=25 #<==每一个单词的首字母大写的写法 2 king_age=25 #<==单词之间用"_"的写法 3 kingAgeSex=25 #<==驼峰语法: 首个单词的首字母小写,其他单词首字母大写 4 kingAGE=25 #<==单词全大写的写法
1 [root@ king tmp]# cat t.sh
2 if [ $# -ne 2 ] #若是执行脚本传参的个数不为2,
3 then
4 echo "USAGE:/bin/sh $0 arg1 arg2" #则给用户提示正确用法,此处的$0,打印脚本名字及路径。
5 exit 1 #若不知足要求,则退出脚本,返回值为1。
6 fi
7 echo $1 $2 #若参数知足要求,则打印$1和$2获取到的传参的字符串。
8 [root@ king tmp]# sh t.sh #若不加参数执行脚本,则直接给出提示。
9 USAGE:/bin/sh t.sh arg1 arg2 #t.sh就是脚本中$0获取的值。
10 [root@ king tmp]# sh t.sh hello world
11 hello world #若参数知足要求,则打印$1和$2获取的字符串,即hello和world。
$0,$n,$#,这几个就很少说了,由于太好理解了,下面咱们来一块儿学习一下$*和$@的区别吧。
咱们能够利用set 来设置位置参数Age of loss
1 [root@king tmp]# set -- "This is" Age of loss. #“--”表示清除全部的参数变量,从新设置后面的参数变量。
2 [root@king tmp]#echo $# #输出参数的个数。
3 3 #共三个参数。
4 [root@king tmp]# echo $1 #打印第一个参数值。
5 This is
6 [root@king tmp]# echo $2 #打印第二个参数值。
7 Age
8 [root@king tmp]# echo $3 #打印第三个参数值。
9 of
10 [root@king tmp]# echo $4 #打印第四个参数值。
11 loss.
12 #测试$*和$@,注意,此时不带双引号:
13 [root@king tmp]# echo $* #打印$*。
14 This is Age of loss.
15 [root@king tmp]# echo $@ #打印$@。
16 This is Age of loss.
17 [root@king tmp]# for i in $*; do echo $i; done #使用for循环输出$*测试。
18 This #($*)不加双引号,所以会输出全部参数,而后第一个参数"This is"也拆开输出了。
19 is
20 Age
21 of
22 loss
23 [root@king tmp]# for i in $@; do echo $i; done #使用for循环输出$@测试。
24 This #($@)不加双引号,所以会输出全部参数,而后第一个参数"This is"也拆开输出了。
25 is
26 Age
27 of
28 loss
29 #测试"$*"和"$@",注意,此时带有双引号:
30 [root@king tmp]# echo "$*"
31 This is Age of loss.
32 [root@king tmp]# echo "$@"
33 This is Age of loss.
34 [root@king tmp]# for i in "$*"; do echo $i; done
35 This is Age of loss. #在有双引号的状况下"$*",参数里引号中的内容看成一个参数输出了!
36 [root@king tmp]# for i in "$@"; do echo $i; done
37 This is #在有双引号的状况下,每一个参数均以独立的内容输出,且有双引号算一个参数。
38 Age
39 of
40 loss
41 #这才真正符合咱们传入的参数需求,set -- "This is" Age of loss.
$?特殊变量,根据返回值来判断备份成功于否,例子
1 [root@king tmp]# cd /etc/
2 [root@king etc]# tar zcf /opt/services.tar.gz ./services #打包备份
3 [root@king etc]# echo $? #检查备份后的,返回0表示打包成功,
4 0
咱们能够查看一下NFS网络文件共享系统/etc/init.d/rpcbind脚本中的50-73行吧,学习一下$?使用,
1 [root@king scripts]# sed -n '63,73p' /etc/init.d/rpcbind #sed -n 打印文件指定行、
2 stop() {
3 echo -n $"Stopping $prog: "
4 killproc $prog #这是中止rpcbind的命令。
5 RETVAL=$? #将上述命令的返回值“$? ”赋值给RETVAL变量,用于后面的判断。
6 echo
7 [ $RETVAL -eq 0 ]&&{ #这里就是判断,若是返回值为0,则执行下面的指令。
8 rm -f /var/lock/subsys/$prog
9 rm -f /var/run/rpcbind*
10 }
11 return $RETVAL #若是返回值不等于0,则跳过判断,直接做为返回值传给执行stop函数的脚本。
12 }
$?返回值的用法总结:
咱们能够man bash 命令,而后搜索"Parameter Expansion"来查找相关的内容帮助
${parameter:-word}用法距离:没有赋值的状况
1 [root@king tmp]# echo $test #变量未设置,因此输出时为空。
2 [root@king tmp]# result=${test:-UNSET} #<==若test没值,则返回UNSET。
3 [root@king tmp]# echo $result #打印result变量,返回UNSET,由于test没有赋值。
4 UNSET
5 [root@king tmp]# echo ${test} #注意,此时打印test变量仍是为空。
结论:对于${test:-UNSET},当test变量没值时,就返回变量结尾设置的UNSET字符串。
赋值的状况
1 [root@king tmp]# test=hello #赋值hello字符串。
2 [root@king tmp]# echo $test
3 hello
4 [root@king tmp]# result=${test:-UNSET}
5 [root@king tmp]# echo $result #由于test已赋值,所以,打印result就输出了test的值hello,而不是原来的UNSET。
6 hello
7 [root@king tmp]# result=${test-UNSET} #定义时忽略了冒号。
8 [root@king tmp]# echo $result
9 hello #打印结果和带冒号时没有变化。
${parameter:=word}和${parameter:-word}差很少,理解都是同样的,变量为赋值就把备胎给变量。。。
${parameter:?word}变量为赋值或空,就将该字符串(word)做为标准错误输出。
1 [root@king tmp]# echo ${key:? not defined} #key变量没有定义,所以,把“not defined”做为标准错误输出。
2 -bash: key: not defined #错误提示,只不过是事先定义好的错误输出。
3 [root@king tmp]# echo ${key? not defined} #去掉冒号定义,并输出,结果一致。
4 -bash: key: not defined
5 [root@king tmp]# key=5 #<==给变量赋值1。
6 [root@king tmp]# echo ${key:? not defined} #由于key有值了,因此,打印key的值。
7 5
8 [root@king tmp]# echo ${key? not defined} #去掉冒号定义,并输出,结果一致。
9 5
10 [root@king tmp]# unset key #取消key的定义。
11 [root@king tmp]# echo ${key:? not defined}
12 -bash: key: not defined #又打印错误提示了。
${parameter:+word}变量为空或没赋值,什么都不作,不然用word字符串替换变量的值
1 [root@king tmp]# key=${value:+word} #value变量未定义。
2 [root@king tmp]# echo $key #由于value变量未定义,因此打印key变量为空。
3 [root@king tmp]# value=25 #value变量赋值为25。
4 [root@king tmp]# key=${value:+word} #注意,这里必定要从新定义key。
5 [root@king tmp]# echo $key
6 word #由于value变量有值,因此打印key变量输出为“:+ ”后面的内容。