• shell脚本的使用


    $#  返回命令行参数个数

    $n  接受终端指定位置参数

    $*  接受终端所有参数(不包含 $0)

    $@  接受终端所有参数(不包含 $0,在for循环时和 $* 的表现有差异)

    $?  返回上一次程序的返回值

    如果要让终端接受 -a 这样的 option,可以用 shell 内建的 getopts 

    getopts 用法:  

    # :ab:c 表示这一段代码只接受 -a 或 -b barg 或 -c 这样的选项,
    while getopts :ab:c option
    do
        case $option in
            a)
                echo "option a is enabled"
                ;;
            b)
                echo "option b is enabled with arguments $OPTARG"
                ;;
            c)
                echo "option c is enabled"
                ;;
            ?)
                echo "no option is enabled"
                exit 1
                ;;
        esac
    done

    看看 getopts :ab:c option 

    getopts 会将匹配到的选项放到 option 变量,当然这个变量可以是其他名字,如果选项需要参数,就会把参数放到 OPTARG 变量,

    getopts 里还可以用一个叫做 OPTIND 变量,用于指示当前选项在终端参数的位置

    a 前面(也就是参数列表前面)的冒号会屏蔽 getopts 的错误消息,当选项没有匹配项时,getops 会提示错误。

    ac 选项都没有参数
    b 后面的冒号表示该选项后面需要跟一个参数,它的参数就被放到了 OPTARG 变量里

    假设我们把这段代码写到一个叫做 task 的脚本或者函数里, 那么输入 task -ac 可以看到这样的内容

    $ task -ac
    option a is enabled
    option c is enabled

    输入 task -b  argb

    $ task -b argb
    option b is enabled with arguments argb

    注意,如果 -b 选项 没有带参数,又没有在参数列表前加上冒号,就会报错 b 选项没有接参数。

    尽管用 getopts 可以支持选项化的参数,但是它有几个个缺点:不支持长选项 - help 或者 --help 这类的选项,对于其他非选项的终端参数则会忽略,而且 getopts 的选项要么带参数,要么不带参数。


    如果需要使用长选项,可以考虑使用 getopt 这个内建命令。

    ARGS=`getopt -o ab:c:: -al along,blong:,clong:: -n "example.sh" -- $*`   # -n 选项指定一个脚本,当终端参数解析出错的时候调用
    
    eval set -- "$ARGS"  # 将解析到的参数分配至 $1  $2  等变量
    
    while  true
    do
        case $1 in
            -a|--along)
                echo "option $1 is enabled"
                shift
                ;;
            -b|--blong)
                echo "option $1 is enabled with argument $2"
                shift 2
                ;;
            -c|--clong)
                echo "option $1 is enabled with argument $2"
                shift 2
                ;;
            --)
                break
                ;;
        esac
    done
    
    for otherargs in $@
    do
        echo $otherargs
    done

    a 选项不带参数,b 选项必须带参数,而 c 选项的参数是可选的,若要向 c 选项传递参数,

    $ task -cargs  # 注意上面 getopt 长选项用到了 -a 选项,所以 cargs 不能是写成 clong,否则 getopt 会将识别成长选项 clong;或者也可以关掉 getopt 的 -a 选项
    ### or ###
    $task -clong=args
    
    $task -c
    $task -clong

    用了 getopt 之后,传入脚本或函数的所有参数都可以使用了,并且还可以使用长选项,用起来很方便。

    reference:

    使用getopt命令解析shell脚本的命令行选项 

    本博客由 BriFuture 原创,并在个人博客(WordPress构建) BriFuture's Blog 上发布。欢迎访问。
    欢迎遵照 CC-BY-NC-SA 协议规定转载,请在正文中标注并保留本人信息。
  • 相关阅读:
    JavaScript对象
    JavaScript基础
    MySQL总结
    前端的基础知识汇总
    反射,面对对象高阶
    django中的认证登陆与用户的创建
    django的cookie和session
    ajax的json包含于xml的区别
    django的分页系统
    django的orm简签
  • 原文地址:https://www.cnblogs.com/brifuture/p/7399535.html
Copyright © 2020-2023  润新知