Shell的几种变量
时间:2007-09-02 来源:wflai
1. 用户定义的变量
用户定义的变量是最普通的Shell变量。变量名是以字母或下线符打头的字母、数字和下线符序列,并且大小写字母意义不同。如dir与Dir是不同的变量。这与C语言中标识符的定义相同。变量名的长度不受限制。
定义变量并赋值的一般形式是:变量名=字符串
注意,在赋值语句中,赋值号“=”的两边没有空格,否则在执行时会引起错误。
变量的值可以改变,只须利用赋值语句重新给它赋值即可。一个未明确赋过值的变量仅含一个空字符串。
在程序中使用变量的值时,要在变量名前面加上一个符号“$”。
如果在赋给变量的值中要含有空格、制表符或换行符,那么,就应该用双引号把这个字符串括起来。例如,
names="abc dd ff"
可以将一个命令的执行结果赋值给变量。有两种形式的命令替换:一种是使用倒引号引用命令,其一般形式是:`命令表`。
例如:将当前工作目录的全路径名存放到变量dir中,输入以下命令行:
$ dir=`pwd`
另一种形式是:$(命令表)。上面的命令行也可以改写为:
$ dir=$(pwd)
2.交互输入变量值
利用read命令可以从键盘上读取数据,然后赋给指定的变量。read命令的一般格式是:
read 变量1 [ 变量2 …]
例如:
read a b c
输入数据时,数据间以空格或制表符作为分隔符。如果变量个数与给定数据个数相同,则依次对应赋值;如果变量个数少于数据个数,则从左至右对应赋值,但最后一个变量被赋予剩余的所有数据;如果变量个数多于给定数据个数,则依次对应赋值,而没有数据与之对应的变量取空串。
3.位置参数
执行Unix/Linux命令或Shell 脚本时可以带有实参。相应地,在Shell脚本中应有变量。执行Shell程序时,用实参去替代这些变量。在Shell脚本中这类变量的名称很特别,分别是0、1、2……这类变量称作位置变量,因为它们与命令行上具体位置的实参相对应:命令名(脚本名)对应位置变量0,第一个实参对应位置变量1,第二个实参对应位置变量2……如果位置变量是由两个或更多个数字构成,那么,必须把它们用一对花括号括起来,如{10}、{11}。命令行实参与脚本中位置变量的对应关系。
例如:
$ set `pwd;ls;date`
$ echo $1 $2 $3 $9 ${10} ${11}
/home/mengqc bash_1 ex1 12 3 21:52:32
如果在脚本中使用的位置参数不超过9个,那么只用$1~$9即可。但是,实际给定的命令行参数有可能多于9个,此时就需要用shift命令移动位置参数。每执行一次shift命令,就把命令行上的实参向左移一位,即相当于位置参数向右移动一个位置。
可以看出,shift命令执行后新$1的值是原$2的值,新$2的值是原$3的值,依此类推。
shift命令不能将$0移走,所以经shift右移位置参数后, $0的值不会发生变化。
4. 预先定义的特殊变量
在Shell中,预先定义了几个有特殊含义的Shell变量,它们的值只能由Shell根据实际情况进行赋值,而不能通过用户重新设置。下面给出这些特殊变量的表示形式及意义:
$# 命令行上实际参数的个数,但不包含Shell脚本名。
$?上一条命令执行后的返回值(也称作 “退出码”)。它是一个十进制数。多数Shell命令执行成功时,则返回值为0;如果执行失败,则返回非0值。
$$ 当前进程的进程号。
$! 上一个后台命令对应的进程号,这是一个由1~5位数字构成的数字串。
$- 由当前Shell设置的执行标志名组成的字符串。例如:
set -xv
这个命令行给Shell设置了标志-x和-v(用于跟踪输出)。
$* 表示在命令行中实际给出的所有实参字符串,它并不仅限于9个实参。
$ @ 它与$*基本功能相同,但“$@”与“$*”不同。