zoukankan      html  css  js  c++  java
  • getopts

    1 shell脚本的参数

    2 参数扩展

    1.shell脚本的参数


    从命令行传递给脚本的参数称为位置参数

    shell脚本中表示位置参数的系统变量
    变量名说明示例
    $n

    1≤n≤9,表示变量的位置顺序

    n≥10

    echo "$1"

    echo "${11}"

    $# 命令行参数的个数 echo "$#"

    $0

    执行的脚本名称

    脚本的文件名

    echo "$0"

    echo "$0" | cut -d/ -f2

    $* 返回所有参数的值

    echo "$*"

    以"$1 $2 … $n"的形式输出

    $@ “同上”,输出形式略有不同

    echo "$@"

    以"$1" "$2" … "$n" 的形式输出

    $_ 代表之前执行的命令的最后一个参数  

      示例,比较$@、$*,脚本haha.sh代码如下:

    #!/bin/bash
    tmp=""
    declare -i k=0
    for i in "$@"; do
        let k+=1
        echo "Cycles: $k"
        tmp=${tmp}"$(echo $i)"
    done

    echo "$tmp"

    如第三行,执行后输出:

    $ ./haha.sh hello sunny !
    Cycles: 1
    Cycles: 2
    Cycles: 3
    hellosunny!

    修改成$*,执行后如下:

    $ ./haha.sh hello sunny
    Cycles: 1
    hello sunny !

    倘若去掉第三行的双引号,输出结果都是一样的,如下:

    $ ./haha.sh hello sunny !
    Cycles: 1
    Cycles: 2
    Cycles: 3
    hellosunny!

      这个例子,说明:第5行如果不带双引号的情况下,$*、$@效果一样。带了双引号,会影响程序的执行。带上双引号后,“$*”就是一个字符串;而“$@”才能准确地表示脚本的多个变量。

      上边的情况是,选项不带空格符“hello world.”,第5行“"$@"”,结果是:

    Cycles: 1
    hello world.

    去掉第5行的双引号:

    Cycles: 1
    Cycles: 2
    helloworld.

    说明带上双引号,才能正确表示选项。

      总结如下表,+表示带上双引号、-表示不带、√表示正确处理、╳处理表示错误。

    位参命令$@$*说明
    + +
    位参中包含空格
    + -  
    - -  
    - + 程序中需要使用双引号时,选择$@

    2.参数扩展


      给脚本传递多个不同值的“同位”参数。这里需要引入“getopts”命令来完成参数扩展。 getopts的使用,有个前提:认为选项不会出现在“?”、“:”之中。

    2.1.语法

      getopts的语法:getopts 选项定义 选项变量名 [args]

      “选项定义”用来设定接受的选项列表。当列表中某个字符后带着“:”时,代表其需要一个参数。

      “选项变量名”用来接收脚本的选项。

      [args]表示,……。(不清楚,找不到合适的解释,有解释的但是没有用法,无法验证,暂略)

      “选项参数”保存在变量OPTARG中,获取到最后一个参数的时候,getopts的返回值“为假”。

      如果“选项定义”首个字符是“:”就关闭了报错机制(静默模式)。也可以使用变量“OPTERR”(设置为0)关闭报错,优先级更高。

     

    2.2.异常

      出现非法选项,变量名被赋值“?”。非静默模式时,输出错误信息,不处理变量OPTARG。静默模式时,非法选项字符被赋值给变量OPTARG。

      缺少参数时,非静默模式情况下“选项变量名”被赋值“?”,不处理OPTARG,输出错误信息。静默模式,“选项变量名”被赋值“:”,OPTARG被赋值“选项字符”。

     

      当从脚本获取到选项时,getopts返回为真。 带有参数的选项缺少参数时,返回就为 false。这段程序,完美演绎了变量 OPTIND 的效果。

    while getopts ":h:d:Dn:f:" opt; do
        echo "<<< opt = $opt >>>"
    
        case "$opt" in
            # Valid options.
            "h")
                echo -e "	Destination hosts: $OPTARG."
                echo -e "	$OPTIND is $OPTIND"
                ;;
            "d")
                echo -e "	Will download file $OPTARG."
                echo -e "	$OPTIND is $OPTIND"
                ;;
            "D")
                echo -e "	Will download all item directory."
                echo -e "	$OPTIND is $OPTIND"
                ;;
            "n")
                echo -e "	Create new directory $OPTARG."
                echo -e "	$OPTIND is $OPTIND"
                ;;
            "f")
                echo -e "	When replaced, specify a new file name. $OPTARG."
                echo -e "	$OPTIND is $OPTIND"
                ;;
            ":")    # Silent, without arg
                echo -e "	Option $OPTARG has't parameter."
                echo -e "	$OPTIND is $OPTIND"
                ;;
            "?")    # Not silent, without arg. And invalid option.
                echo -e "	Invalid option $OPTARG."
                echo -e "	$OPTIND is $OPTIND"
                ;;
            "*")    # Impossible to implement.
                echo -e "	unkown error from arg."
                echo -e "	$OPTIND is $OPTIND"
                ;;
        esac
    done

      看看这段代码的运行效果

    # 完整效果
    [view@file milo]$ bin/milo -h app47,app160,zcw -d *.properties -D -n web/newHtml/memberList/img -f *.png
    <<< opt = h >>>
        Destination hosts: app47,app160,zcw.
        $OPTIND is 3
    <<< opt = d >>>
        Will download file *.properties.
        $OPTIND is 5
    <<< opt = D >>>
        Will download all item directory.
        $OPTIND is 6
    <<< opt = n >>>
        Create new directory web/newHtml/memberList/img.
        $OPTIND is 8
    <<< opt = f >>>
        When replaced, specify a new file name. *.png.
        $OPTIND is 10

    # -f 选项缺少参数
    [view@file milo]$ bin/milo -h app47,app160,zcw -d *.properties -D -n web/newHtml/memberList/img -f
    <<< opt = h >>>
        Destination hosts: app47,app160,zcw.
        $OPTIND is 3
    <<< opt = d >>>
        Will download file *.properties.
        $OPTIND is 5
    <<< opt = D >>>
        Will download all item directory.
        $OPTIND is 6
    <<< opt = n >>>
        Create new directory web/newHtml/memberList/img.
        $OPTIND is 8
    <<< opt = : >>>
        Option f has't parameter.
        $OPTIND is 9

    # -h 选项缺少参数,-h 选项位于所有选项的最前面
    [view@file milo]$ bin/milo -h -d *.properties -D -n web/newHtml/memberList/img -f
    <<< opt = h >>>
        Destination hosts: -d.
        $OPTIND is 3
    # 某个选项缺少参数时,程序终止执行

    # 缺少参数时都会终止运行,但进入的分支有差异
    [view@file milo]$ bin/milo -f
    <<< opt = : >>>
        Option f has't parameter.
        $OPTIND is 2
    getopts ":ln:" opt
    项目意义
    getopts 命令
    ":ln:"

    选项定义,定义脚本处理的选项列表

    opt
    选项变量名,捕获脚本执行时使用的选项
    ":ln:"
    项目意义
    : 选项定义首个字符是冒号时,代表getopts运行在静默模式。
    l 定义了一个无参数的选项 l
    n: 定义带参数的选项 n
    检查执行效果
    执行效果  

    $ ./my-getopts.sh -l

    option l

    选项 l 处理选项 l
    $ ./my-getopts.sh -n

    No arg.

    省略参数的选项 n 在循环中使用“:”处理忘记了参数的选项
    $ ./my-getopts.sh -n 3

    option n has vlaue 3

    带参数 3 的选项 n 处理 选项 n 及 n 的值 3

    $ ./my-getopts.sh -k

    invalid arg.

    未定义的选项

    2.3.试数

      探测下运行机制……

    #!/bin/bash
    
    declare -i sw=0
    
    while getopts ":abc" option
    do
            echo "option is ${option}."
            echo "OPTARG is ${OPTARG}."
            echo "OPTIND is ${OPTIND}."
            sw=1
    done
    
    # Without option
    [ $sw -eq 0 ] && echo "without any option?" && echo "OPTIND is ${OPTIND}."

    改进意见:例子清晰,针对不同选项使用的测试效果清楚

    一切代码都是为了生活,一切生活都是调剂
  • 相关阅读:
    [翻译] GCDObjC
    [翻译] ValueTrackingSlider
    [翻译] SWTableViewCell
    使用 NSPropertyListSerialization 持久化字典与数组
    [翻译] AsyncImageView 异步下载图片
    KVC中setValuesForKeysWithDictionary:
    [翻译] Working with NSURLSession: AFNetworking 2.0
    数据库引擎
    什么是数据库引擎
    网站添加百度分享按钮代码实例
  • 原文地址:https://www.cnblogs.com/argor/p/7911041.html
Copyright © 2011-2022 走看看