SHELL变量
下面我们详细的介绍Bourne Shell的编程:
自从贝尔实验室设计了Bourne
Shell。从那时起许多厂商根据不同的硬件平台设计了许多版本得unix。但在众多版本的unix中,Bourne Shell
一直保持一致。
1>Bsh的启动:用户在登陆后,系统根据文件/etc/passwd中有关该用户的信息项启动Shell。例如某用户在passwd中
的信息项为:
ice_walk:!:411:103:Imsnow ,ice_walk:/home/ice_walk:/bin/bsh
则表明,用户名是ice_walk等信息,在最后一项\"/bin/bsh\"表明用户的sh环境类型是bsh,于是系统启动之。在启动或执行(包括下面我们要讲
的shell程序--脚本)过程中可以使用以下一些参数,我们一一说明:
-a 将所有变量输出
-c \"string\"从string中读取命令
-e 使用非交互式模式
-f 禁止shell文件名产生
-h 定义
-i 交互式模式
-k 为命令的执行设置选项
-n 读取命令但不执行
-r 受限模式
-s 命令从标准输入读取
-t 执行一命令,然后退出shell
-u 在替换时,使用未设置的变量将会出错
-v 显示shell的输入行
-x 跟踪模式,显示执行的命令
许多模式可以组合起来用,您可以试试了,但-ei好象不行,你说why呢?
使用set可以设置或取消shell的选项来改变shell环境。打开选项用\"-\",关闭选项用\"+\",多数unix允许打开或关闭a、f、e、h、k、n、
u、v和x选项。若显示Shell中已经设置的选项,执行:
$echo $-
Bsh中每个用户的home目录下都有一个.profile文件,可以修改该文件来修改shell环境。为了增加一个可执行文件的路径(例如/ice_walk/bin),
可以把下面代码加入.profile中
PATH=$PATH:/ice_walk/bin;exprot PATH
.profile中shell的环境变量意思如下:
CDPATH 执行cd命令时使用的搜索路径
HOME 用户的home目录
IFS 内部的域分割符,一般为空格符、制表符、或换行符
MAIL 指定特定文件(信箱)的路径,有UNIX邮件系统使用
PATH 寻找命令的搜索路径(同dos的config.sys的 path)
PS1 主命令提示符,默认是\"$\"
PS2 从命令提示符,默认是\">\"
TERM 使用终端类型
2>Bsh里特殊字符及其含义
在Bsh中有一组非字母字符。这些字符的用途分为四类:作为特殊变量名、产生文件名、数据或程序控制以及引用和逃逸字符控制。他们
可以让用户在Shell中使用最少的代码完成复杂的任务。
*> Shell变量名使用的特殊字符
$# 传送给命令Shell的参数序号
$- 在Shell启动或使用set命令时提供选项
$? 上一条命令执行后返回的值
$$ 当前shell的进程号
$! 上一个子进程的进程号
$@ 所有的参数,每个都用双括号括起
$* 所有参数,用双括号括起
$n 位置参数值,n表示位置
当前shell名
*>产生文件名的特殊字符
包括\"*\",\"?\",\"[]\",上面讲过,不再多说。
*>数据或程序控制使用的特殊字符
>(file) 输出重定向到文件中(没有文件则创建,有则覆盖)
>>(file)
输出重定向到文件中(没有则创建,有则追加到文件尾部)
<(file) 输入重定向到文件
; 命令分割符
| 管道符
& 后台运行(例如:sleep 10 &
` ` 命令替换,重定向一条命令的输出作为另一命令的参数
*>对于引用或逃逸的特殊字符
Bsh用单引号\' \'和双引号\"
\"将特殊字符或由空白分隔的字引用起来组成一个简单的数据串.使用单引号和双引号的区别是双引号中的内容可进行参数和变量替换.逃逸字符也一样.
$echo \"$HOME $PATH\"
结果显示$/u/ice_walk/bin:/etc:/usr/bin
而$echo \'$HOME $PATH\' 结果显示$HOME $PATH
shell的逃逸符是一个\"\\\",表示其后的字符不具有特殊的含义或不是shell的函数
$echo $HOME $PATH
结果显$$HOME /bin:/etc:/usr/bin:
3>Bsh的变量
前面我们在多个地方引用了变量,当Shell遇到一个\"$\"符时(没有被引用或逃逸),它将认为其后为一变量。不论该变量是环境变量还是用户自定义的变量,在命令行中变量名要被变量值替换。例如命令:ls
$HOME将列出变量HOME对应目录下的文件。
用户可以在命令行中的任何地方进行变量替换。包括命令名本身,例如:
$dir=ls
$$dir f*
将列出以f开头的文件。
现在详细的介绍下Bsh的变量。Bsh中有四类变量:用户定义的变量、位置变量(shell参数)、预定义变量及环境变量。
用户定义的变量:
用户定义的变量由字母和下划线组成,并且变量名的第一个字符不能为数字(0~9)。与其他UNIX名字一样,变量名是大小写敏感的。用户可以在命令行上用\"=\"给变量赋值,例如:
$NAME=ice_walk
给变量NAME赋值为ice_walk,在应用变量NAME的时候,在NAME前加\"$\"即可,前面已说,不再废话(别说我废话多,关键是没当过老师)。可以用变量和其他字符组成新的字,例如:
$SUN=sun
$echo $day
在应用shell变量时候,可以在变量名字两边$后面加上{},以更加清楚的显示给shell,哪个是真正的变量,以实现字符串的合并等功能。
结果显示:sunday(注意不能echo
$SUNday,因为SUNday变量没定义,读者试下执行结果)
用户也可以在命令行上同时对多个变量赋值,赋值语句之间用空格分开:
$X=x Y=y
注意变量赋值是从右到左进行的
$X=$Y Y=y
X的值是y
$X=z Y=$Z
Y的值是空(变量未赋值时,shell不报错,而是赋值为空)
用户可以使用\"unset <变量>\"命令清除给变量赋的值
用户使用变量时要在其前面加一\"$\"符,使变量名被变量值所替换。Bsh可以进行变量的条件替换,即只有某种条件发生时才进行替换。替换条件放在一对大括号{}中,如:
${variable: -value}
variable是一变量值,value是变量替换使用的默认值
$echo Hello $UNAME
结果显示:Hello
$echo Hello ${UNAME: -there}
结果显示:Hello there
$echo $UNAME
结果显示: (空)
$UNAME=John
$echo Hello ${UNAME: -there}
结果显示:Hello John
可以看出,变量替换时将使用命令行中定义的默认值,但变量的值并没有因此而改变。另外一种替换的方法是不但使用默认值进行替换,而且将默认值赋给该变量。其形式如下:
$
该形式在变量替换后同时把值value符给变量variable。
$echo Hello $UNAME
结果显示:Hello
$echo Hello $
结果显示:Hello there
$echo $UNAME
结果显示:there
$UNAME=John
$echo Hello $
结果显示:Hello John
变量替换的值也可以是` `括起来的命令:
$USERDIR={$Mydir: -`pwd`}
第三种变量的替换方法是只有当变量已赋值时才用指定值替换形式:
${variable: +value}
只有变量variable已赋值时,其值才用value替换,否则不进行任何替换,例如:
$ERROPT=A
$echo ${ERROPT: +\"Error tracking is acitive\"}
结果显示:Error tracking is acitive
$ERROPT=
$echo ${ERROPT: +\"Error tracking is acitive\"}
结果显示: (空)
我们还可以使用错误检查的条件进行变量替换:
$
当变量variable已设置时,正常替换。否则消息message将送到标准错误输出(若此替换出现在shell程序中,那么该程序将终止)。 例如:
$UNAME=
$echo $ {UNAME:?\"UNAME HAS NOT BEEN SET\"}
结果显示:UNAME HAS NOT BEEN SET
$UNAME=Stephanie
$echo $ {UNAME:?\"UNAME HAS NOT BEEN SET\"}
结果显示:Stephanie
当没有指定message时,shell将显示一条默认的消息,例如:
$UNAME=
$echo $
结果显示:sh:UNAME

arameter null or not set