• 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,证明循环了三次

更多...

加载中...