zoukankan      html  css  js  c++  java
  • Linux——Shell脚本参数传递的2种方法

    前言

    平时会遇到很多脚本都有参数选项,类似:

    ./test.sh -f config.conf -v --prefix=/home

    这种脚本怎么写呢?

    一、Shell 特殊参数解释

     首先来看几个特殊变量:$0, $#, $*, $@, $?, $$, $_
    • 示例1:新建一个test.sh的文件
    #!/bin/bash
    echo $0    # 当前脚本的文件名(间接运行时还包括绝对路径)。
    echo $n    # 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是 $1 。
    echo $#    # 传递给脚本或函数的参数个数。
    echo $*    # 传递给脚本或函数的所有参数。
    echo $@    # 传递给脚本或函数的所有参数。被双引号 (" ") 包含时,与 $* 不同,下面将会讲到。
    echo $?    # 上个命令的退出状态,或函数的返回值。
    echo $$    # 当前 Shell 进程 ID。对于 Shell 脚本,就是这些脚本所在的进程 ID。
    echo $_    # 上一个命令的最后一个参数
    echo $!    # 后台运行的最后一个进程的 ID 号

    执行结果如下:

    $ ./test.sh test test1 test2 test3 test4
    
    ./test.sh                      # $0
                                   # $n
    5                              # $#
    test test1 test2 test3 test4   # $*
    test test1 test2 test3 test4   # $@
    0                              # $?
    12305                          # $$
    12305                          # $_
                                   # $!

    $* 和 $@ 都表示传递给函数或脚本的所有参数,不被双引号 ("") 包含时,都以"$1""$2" … "$n" 的形式输出所有参数。

    但是当它们被双引号 ("") 包含时,"$*"会将所有的参数作为一个整体,以"$1 $2 … $n"的形式输出所有参数;"$@"会将各个参数分开,以"$1""$2" … "$n" 的形式输出所有参数。

    二、方法1:$0,$1,$2..

    采用$0,$1,$2..等方式获取脚本命令行传入的参数,值得注意的是,$0获取到的是脚本路径以及脚本名,后面按顺序获取参数,当参数超过10个时(包括10个),需要使用${10},${11}....才能获取到参数。

    • 示例2:新建一个test.sh的文件
    #!/bin/bash
    echo "脚本$0"
    echo "第一个参数$1"
    echo "第二个参数$2"

    执行结果如下:

    $ ./test.sh 1 2
     
    #shell中将会输出:
    脚本./test.sh
    第一个参数1
    第二个参数2
    • 示例3:参数超过10个的情况,在test.sh文件写入
    #!/bin/bash
    echo "脚本名$0"
    echo "第一个参数$1"
    echo "第二个参数$2"
    echo "第三个参数$3"
    echo "第四个参数$4"
    ……
    echo "第十个参数$10"
    echo "第十个参数${10}"

    执行结果如下:

    $ ./test.sh a b c d e f g h i j
    
    #shell中将会输出:
    脚本名./test.sh
    第一个参数a
    第二个参数b
    第三个参数c
    第四个参数d
    第五个参数e
    第六个参数f
    第七个参数g
    第八个参数h
    第九个参数i
    第十个参数j

    优点:获取参数更容易,执行脚本时需要的输入少

    缺点:必须按照顺序输入参数,如果中间漏写则参数对应就会错误

    三、方法2:getopts

    语法格式:getopts [option[:]] [DESCPRITION] VARIABLE
    option:表示为某个脚本可以使用的选项
    ":":如果某个选项(option)后面出现了冒号(":"),则表示这个选项后面可以接参数(即一段描述信息DESCPRITION)
    VARIABLE:表示将某个选项保存在变量VARIABLE中

    • 示例4:新建一个test.sh文件
    while getopts ":a:b:c:" opt
    do
        case $opt in
            a)
            echo "参数a的值$OPTARG"
            ;;
            b)
            echo "参数b的值$OPTARG"
            ;;
            c)
            echo "参数c的值$OPTARG"
            ;;
            ?)
            echo "未知参数"
            exit 1;;
       :)
    echo "没有输入任何选项 $OPTARG"
         ;;
    esac done

    用一个while循环加case分支获取不同参数,:a:b:c相当于定义参数的变量名,有时候可能会有未知参数,所以增加一个?的分支。

    执行结果如下:

    $ ./test.sh -a 1 -b 2 -c 3
    
    #在shell中的输出
    参数a的值1
    参数b的值2
    参数c的值3
    $ ./test.sh -a 1 -c 3
    
    #在shell中的输出
    参数a的值1
    参数c的值3
    $ ./test.sh -a 1 -c 3 -d 4
    
    #在shell中的输出
    参数a的值1
    参数c的值3
    未知参数

    优点:由于使用了-a加参数值的方式进行一一匹配,所以不会参数匹配错误,同时也可以缺省参数,并不会导致参数错误,同时也便于后期参数的扩展和移植

    缺点:脚本执行时参数需要的输入会增多

  • 相关阅读:
    C# 操作Word目录——生成、删除目录
    Java PDF页面设置——页面大小、页边距、纸张方向、页面旋转
    【BZOJ3157/3516】国王奇遇记(数论)
    【BZOJ2137】submultiple(数论)
    【CF734F】Anton and School(构造)
    【CF618F】Double Knapsack(构造)
    【BZOJ2034】最大收益(贪心)
    【CF981D】Bookshelves(贪心,动态规划)
    【CF865D】Buy Low Sell High(贪心)
    【BZOJ3716】[PA2014]Muzeum(贪心,网络流)
  • 原文地址:https://www.cnblogs.com/caoweixiong/p/12334418.html
Copyright © 2011-2022 走看看