• 『忘了再学』Shell基础 — 16、位置参数变量


    位置參数变量的作用主要用于脚本的传参。

    位置參数变量的名称和作用都是确定不能改变的,但是该变量的内容是可以更改的,也就是变量的值。

    位置參数变量如下:

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

    1、位置参数变量$n

    $nn为数字,$0代表命令本身,$1-$9代表(脚本命令的)第一到第九个参数,十以上的参数需要用大括号包含,如${10}${15}。(这个是一个典型的向Shell脚本当中传递值的方式)

    (1)示例:

    shell
    # 定义一个shell脚本,简单的计算器,求两个数的和。
    
    [root@Lyl tmp]# vim count.sh
    
    # 脚本内容如下:
    
    #!/bin/bash
    
    # 给num1变量赋值是第一个参数
    num1=$1
    # 给num2变量赋值是第二个参数
    num2=$2
    
    # 变量sum是变量num1加变量num2的(其实上边的num1和num2的定义可以省略)
    sum=$(($num1 + $num2))
    # 注意:执行count.sh脚本后的第一个参数会传递给$1,第二个参数会传递给$2
    # 然后$num1$num2进行求和,再赋值给sum变量。
    # 但是Shell中自定义变量的默认类型是字符串类型,
    # 而我们传入的两个数字类型的变量值,Shell默认都识别为字符串类型。
    # 而这个时候我们就需要$(( ))把这个两个字符串类型的数值括起来,
    # Shell才能知道要进行数值运算,里边的参数都是数值(Shell运算符中会详细讲)。
    # 而$( )是括系统命令的,然后把该命令运行的结果,赋值给前面的变量,这个我们要注意。
    
    
    #打印变量sum的值
    echo $sum
    echo $0
    
    # 执行该脚本
    [root@Lyl tmp]# chmod 755 count.sh
    [root@Lyl tmp]# ./count.sh 22 66
    88
    ./count.sh
    

    (2)总结:

    • $1保存的是执行Shell命令之后的第一个参数,
    • $2保存的是执行Shell命令之后的第二个参数,
    • $0代表执行脚本的命令,如上边的./count.sh
    • 位置參数变量好处。
      其作用就是把执行脚本命令后输入的参数,传入到脚本中,使脚本中的变量可以灵活取值。
    • 位置參数变量的缺点。
      如果是一个普通的Linux用户,该脚本并不是自己写的。当你获得该脚本的时候,你是无法知道需要在脚本后边是否加参数,或者是加什么参数,脚本才能正确运行,是没有任何提示的。
      所以用位置參数变量传参,并不适合给普通用户来使用,一般是写的脚本自己用的时候,用的比较多。

    提示:

    位置參数变量也可以给函数中传参(其实就是自己给自己传值)。

    给普通用户的脚本,传参的方式用read,会有提示,比较友好,我们之后说明。

    2、位置参数变量$*$@

    $*:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体。

    $@:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待。

    (1)用法

    我们先写一个脚本来展示一下位置参数变量$*$@的用法:

    shell
    # 定义一个脚本parameter.sh
    
    [root@Lyl tmp]# vim parameter.sh
    
    
    # 脚本内容如下:
    
    #!/bin/bash
    
    # 使用$*代表所有的参数(所有参数整体对待)
    echo "The parameters \$* is:$*"
    # 使用也代表所有参数(所有参数分开对待)
    echo "The parameters \$@ is:$@"
    
    
    
    # 执行该脚本
    [root@Lyl tmp]# chmod 755 parameter.sh 
    [root@Lyl tmp]# ./parameter.sh 11 22 33 44
    The parameters $* is:11 22 33 44
    The parameters $@ is:11 22 33 44
    

    我们可以看到位置参数变量$*$@,都把执行脚本命令后边带的参数打印出来了。

    (2)区别

    位置参数变量$\*$@的区别是,$*把所有参数当作一个整体,而$@是先把11赋值给$@,在把22赋值给$@,以此类推,是分开的。

    我们通过下边的例子来说明:

    shell
    # 我们先简单的来说一下for循环
    # 简单的for循环例子
    
    for i in 1 2 3 4
            do
                echo $i
            done
    
    # 说明:
    #in后有几个数或者说是以空格隔开的变量(因为默认都是字符串类型),
    # in后有几个变量,这个for循环就循环几次。
    # 第一次循环,把第一个变量赋值给in前边的变量i,然后进入循环操作。
    # 这只是for循环的一种形式,知道流程即可,后边会在详细说明Bash中的for循环。
    # dodone就类似于Java中for循环的大括号(先这样理解就可以)。
    
    
    # 写一个for循环脚本
    [root@Lyl tmp]# vim for.sh
    
    
    # 脚本内容如下:
    
    #!/bin/bash
    for i in 1 2 3 4
        do
            echo $i
        done
    
    # 执行该脚本
    [root@Lyl tmp]# chmod 755 for.sh
    [root@Lyl tmp]# ./for.sh
    1
    2
    3
    4
    

    示例区别:

    shell
    # 定义一个脚本param.sh
    [root@Lyl tmp]# vim param.sh
    
    
    # 脚本内容如下:
    
    #!/bin/bash
    
    # 定义for循环,in后面有几个值,for会循环多少次,
    # 注意"S*"要用双引号括起来,每次循环会把in后面的值赋予变量i,
    # Shell把$*中的所有参数看成是一个整体,所以这个for循环只会循环一次。
    
    for i in "$*"
        do
            # 打印变量i的值
            echo "循环了"$i
        done
    
    echo "==============="
    
    # Shell把$@中的每个参数都看成是独立的,所以“$@"中有几个参数,就会循环几次。
    # 注意两个for循环的变量名最好不相同,以示区别。相同也没关系。
    for j in "$@"
        do
            # 打印变量j的值
            echo "循环了"$j
        done
    
    
    # 执行该脚本
    [root@Lyl tmp]# chmod 755 param.sh
    [root@Lyl tmp]# ./param.sh 11 22 33 44
    循环了11 22 33 44
    ===============
    循环了11
    循环了22
    循环了33
    循环了44
    

    图示:

    image

    3、位置参数变量$#

    $#:这个变量代表命令行中所有参数的个数。

    示例:

    shell
    # 定义一个脚本parameter.sh
    
    [root@Lyl tmp]# vim parameter.sh
    
    
    # 脚本内容如下:
    
    #!/bin/bash
    
    # 使用$#代表所有参数的个数
    echo "The parameters \$# is:$#"
    
    
    # 执行该脚本
    [root@Lyl tmp]# chmod 755 parameter.sh
    [root@Lyl tmp]# ./parameter.sh 11 22 33 44
    The parameters $# is:4
    

    __EOF__

  • 本文作者: 繁华似锦的博客
  • 本文链接: https://www.cnblogs.com/liuyuelinfighting/p/16300430.html
  • 关于博主: 评论和私信会在第一时间回复。或者直接私信我。
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
  • 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。
  • 相关阅读:
    ORB-SLAM2算法14之局部建图线程Local Mapping
    C++——map和set类用法指南
    论文浅尝 | 训练语言模型遵循人类反馈的指令
    图像形态学操作:基于CUDA的图像处理算法---灰度图像腐蚀
    不要错过,Hadoop、Spark 核心技术栈讲解
    所有计算机专业考研都变了!西安邮电大学计算机考研改考
    Hololens 2 新建自定义按钮
    【相关概念】经济金融中的Momentum
    SQLAlchemy关联表删除策略设置
    P1875 佳佳的魔法药水
  • 原文地址:https://www.cnblogs.com/liuyuelinfighting/p/16300430.html