SHELL 学习笔记6 --环境变量和shell变量
时间:2009-03-03 来源:gezn
环境和shell变量
1. 四种shell变量
1) 本地变量
2) 环境变量
还有两种变量被认为是特殊变量(只读)
3) 位置变量
4) 特定参数变量
2. 本地变量
1) 在用户现在的shell生命期的脚本中使用,如果在shell中启动另一个进程或退出,此值将失效。
2) 设置变量;variable-name=value
Eg:name=gezn;echo $name //定义一个变量name,然后打印该变量,将输出gezn
3) 显示变量:echo $variable-name或echo $(variable-name)
4) 清除变量:unset variable-name eg:unset name; echo $name//清除了变量name,echo的输出为空白
5) 显示所有本地shell变量:set
3. 测试本地变量是否已设置
1)$(var:-value):如果变量var未定义,返回一个默认值。
如果var存在且非空,则表达式${var:-value}的值为$var,如果var未定义,则表达式值${var:-value}为value
Eg: name1=”gezn”;name2=${name1:-no name};echo $name1 $name2 //将打印gezn gezn
Unset name1;name2=${name1:-no name}; echo $name1 $name2//将打印no name
1) ${var:=value}:如果变量var未定义,设置var的默认值为value。
如果var存在且非空,则${var:=value}的值为$var;如果var为空或未定义,则var被赋值value且表达式值为value
Eg; name1=”gezn”;name2=${name1;=no name};echo $name1 $name2//将打印gezn gezn
Unset name1;name2=${name1:=no name}; echo $name1 $name2//将打印no name no name
3) ${var:?mesg}:捕获未定义变量导致的错误。
如果var存在且非空,则${var:?value}的值为$var;如果var为空或未定义,则打印mesg并终止脚本
Eg: name1=”gezn”;name2=${name1:?error,novalue};echo $name1 $name2//将打印gezn gezn
Unset name1; name2=${name1:?error,novalue};echo $name1 $name2//将打印-bash:name1:error,no value
Unset name1;name2=${name1:?error, no value};echo $name1
//将打印 –bash:name1: error,novalue
Unset name1;name2=${name1:?error,no value};echo $name2
//将打印 –bash:name1;error, no value
4)${var:+mesg} :测试一个变量的存在性.
如果var存在且非空,则${var:+mesg}的返回值为mesg;如果var为空或未定义则返回null
Eg:
name1=”gezn”;name2=${name1:+value ok};echo $name1 $name2//将打印gezn value ok
Unset name1;name2=${name1: +value ok }; echo $name1 $name2//将打印null null(空行)
2) 设置只读变量
Varname=var; readonly varname
查看所有只读变量 readonly –p
5.环境变量
1) 登录进程成为父进程,shell中执行的用户进程均称为子进程。环境变量可用于所有子进程,着包括编辑器、脚本和应用。环境变量最好在profile文件中定义。习惯上,所有环境变量均应该大写
2)设置环境变量:AENAME=value;export VARNAME
3)显示环境变量; echo $VARNAME
4) 查看所有的环境变量:env
5)清除环境变量:unset VARNAME
6.SHELL预留的环境变量名
每一种shell有些预留大的环境变量名,这些变量名不能用作其他用途。Eg:Bourne Shell的环境变量有HOME,PATH,LANG,PED,PS1,EDITOR….
7.export命令
1) export varname命令可以把变量varname输出到子进程中,如果在子进程中修改了变量varname的值,退出子进程后在子进程中被赋的值将不会传回到父进程。
2)不可以将其变量从子进程到处父进程,然而通过重定向就可以做到这一点
8.位置参数变量
位置变量的数目可以任意多,但一般只有$0-$9可以被访问,都用于脚本中。
$0 $1 $2 $3 $4 $5 $6 $7 $8 $9 ($0 的值为脚本名)
Eg: service httpd status //对于脚本/sbin/service来说,$0的值为service,$1的值为httpd,
//$2的值为status。可以在service脚本中使用这些变量来传递参数值
1. 特定参数变量(7个)
$#:传递到脚本的参数的个数。
$*:以一个单字符串显示所有向脚本传递的参数。$*等价与“$1 $2 $3…$n”
$$: 脚本运行的当前ID号;
$!:最后一个后台运行的进程的进程ID号;
$@:与$*类似,但是使用时加引号,并在引号汇总返回每个参数(返回一个参数列表)。$*等价于“$1” “$2”…“$n”
$-:显示shell使用的当前选项。
$?:显示前面最后一个命令的退出状态。0表示没错误,其他任何值表明有错误。
2. 退出状态
1) $?可以在任何命令或脚本中返回此变量以获得返回信息。检验脚本退出状态时,最好将返回值赋值给一个有意义的名字的变量,这样可以增加脚本的可读性。
2) 举例:cp ok.txt /usr/local/app/def>/dev/null2>&1
cp_status=$? //保存上一条命令(cp)的退出状态
echo $cp_status //打印保存的状态值
-------------------------------------------------------------------------------------------------