shell变量

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

-v  显示shell所读取的输入值。
-x  执行指令后,会先显示该指令及所下的参数。

这个命令行给Shell设置了标志-x和-v(用于跟踪输出)。

$* 表示在命令行中实际给出的所有实参字符串,它并不仅限于9个实参。

$@ 它与$*基本功能相同,但$@$*不同。如下实例:

脚本名称叫test.sh 入参三个: 1 2 3
运行test.sh 1 2 3后
$*为"1 2 3"(一起被引号包住)
$@为"1" "2" "3"(分别被包住)
$#为3(参数数量)


你可能感兴趣的:(shell)