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加参数值的方式进行一一匹配,所以不会参数匹配错误,同时也可以缺省参数,并不会导致参数错误,同时也便于后期参数的扩展和移植

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

  • 相关阅读:
    如何通过命令行窗口查看sqlite数据库文件
    eclipse自动补全的设置
    文本装饰
    注释和特殊符号
    文本装饰
    网页背景
    通过ArcGIS Server admin 查看和删除已注册的 Web Adaptor
    通过 ArcGIS Server Manager 查看已安装的 Web Adaptor
    通过 ArcGIS Server Manager 验证 DataStore
    Windows上安装ArcGIS Enterprise——以 Windows Server 2012 R2上安装 ArcGIS 10.8为例
  • 原文地址:https://www.cnblogs.com/caoweixiong/p/12334418.html
Copyright © 2011-2022 走看看