Shell(Bash)位置参数变量用法详解

Linux 的命令行中,当一条命令或脚本执行时,后面可以跟多个参数,我们使用位置参数变量来表示这些参数。

其中,$0 代表命令行本身,$1 代表第 1 个参数,$2 代表第 2 个参数,依次类推。当参数个数超过 10 个时,就要用大括号把这个数字括起来,例如,${10} 代表第 10 个参数,${14} 则代表第 14 个参数。举个例子:

[root@localhost ~]# ls anaconda-ks.cfg install.log install.log.syslog

如果执行这样一条命令,则 $0 的值就是 ls 命令本身,$1 的值就是 anaconda-ks.cfg 这个文件,$2 是 install.log 文件,$3 是 install.log.syslog 文件。

Shell 中可以识别的位置参数变量如表 1 所示。

表 1 位置参数变量
位置参数变量 作 用
$n n 为数字,$0 代表命令本身,$1〜$9 代表第 1〜9 个参数,10 以上的参数需要用大括号包含, 如${10}
$* 这个变量代表命令行中所有的参数,把所有的参数看成一个整体
$@ 这个变量也代表命令行中所有的参数,不过 $@ 把每个参数区别对待
$# 这个变量代表命令行中所有参数的个数

位置参数变量要用于向命令或程序脚本中传递信息,比如,我们想要写一个计算器,要告诉程序应该运算哪个字符,这时就需要通过位置参数变量向脚本中传递数值,命令如下:

[root@localhost ~]# cd sh/
[raot@localhost sh]# vi count.sh
#!/bin/bash
num1=$1
#给num1变量赋值是第一个参数
num2=$2
#给num2变量赋值是第二个参数
sum=$(($num1 + $num2))
#变量sum的和是num1加num2
echo $sum
#打印变量sum的值

在 Shell 中,数值运算是必须使用特殊格式的(后续章节会做详细介绍),这里大家先照着例子操作。 执行一下此脚本:

[root@localhost sh]# chmod 755 count.sh
#给脚本文件赋予执行权限
[root@localhost sh]#./count.sh 11 22
33
#这个脚本就会把第一个参数和第二个参数相加

还有几个位置参数变量是干什么的呢?我们再写一个脚本来说明一下,如下:

[root@localhost sh]# vi parameter.sh
#!/bin/bash
echo "A total of $# parameters"
#使用$#代表所有参数的个数
echo 'The parameters is: $*"
#使用$*代表所有的参数
echo 'The parameters is: $@"
#使用$@也代表所有的参数

执行此脚本:

[root@localhost sh]# chmod 755 parameter.sh
[root@localhost sh]#./parameter.sh 11 22 33
A total of 3 parameters
#因为输入了三个参数,所以$#显示的值是3
The parameters is: 11 22 33
#输出了所有参数
The parameters is: 11 22 33
#也输出了所有参数

那么"$*"和"$@"有区别吗?还是有区别的,$* 会把接收到的所有参数当成一个整体对待,而 $@ 则会区别对待接收到的所有参数。还是举个例子吧:

[rootdlocalhost sh]# vi parameter2.sh
#!/bin/bash
for i in "$*"
#定义for循环,in后面有几个值,for就会循环多少次,注意"$*"要用双引号括起来
#每次循环都会把in后面的值赋予变量i
#Shell把“$*”中的所有参数看成一个整体,所以这个for循环只会循环一次
    do
        echo "The parameters is: $i"
        #打印变量$i的值
    done
x=0
#定义变量x的值为0
for y in "$@"
#同样,in后面有几个值,for就会循环几次,每次都把值赋予变量y
#因为Shell会把“$@”中的每个参数都看成独立的,所以“$@”中有几个参数,就会循环几次
    do
        echo "The parameter$x is: $y"
        #输出变量y的值
        x=$(( $x +1 ))
        #让变量x每次循环都加1 ,是为了输出时看得更清楚
    done
echo "x is: $x"

在这个脚本中我们用到了 for 循环,关于 for 循环,我们在后续章节中还会有详细介绍。执行一下这个脚本:

[root@localhost sh]# chmod 755 parameter2.sh
[root@localhost sh]#./parameter2.sh 11 22 33
The parameters is: 11 22 33
#这是第一个for的结果,"$*"被看作一个整体,所以只会循环一次
The parameter1 is: 11
The parameter2 is: 22
The parameter3 is: 33
#这是第二个for的结果,“$@”中的每个变量被区别对待,所以会循环三次
x is:3
#x的值是 3,证明循环了三次