zoukankan      html  css  js  c++  java
  • [记录]Shell中的getopts和getopt用法

    Shell中的getopts和getopt用法
    1.getopts
    getopts(shell内置命令)不能直接处理长的选项(如:--prefix=/home等),getopts有两个参数,第一个参数是一个字符串,包括字符和“:”,每一个字符都是一个有效的选项,如果字符后面带有“:”,表示这个字符有自己的参数。getopts从命令中获取这些参数,并且删去了“-”,并将其赋值在第二个参数中,如果带有自己参数,这个参数赋值在“optarg”中。提供getopts的shell内置了这里变量$optarg存储相应选项的参数,而$optind总是存储原始$*中下一个要处理的元素位置。while getopts ":a:bc" opt  #第一个冒号表示忽略错误;字符后面的冒号表示该选项必须有自己的参数.
    例子:
    #cat getopts.sh
    #!/bin/bash
    
    echo $*  
    while getopts ":a:bc" opt  
    do  
      case $opt in  
        a )
          echo $optarg  
          echo $optind
          ;;  
        b )
          echo "b $optind"
          ;;  
        c )
          echo "c $optind"
          ;;  
        ? )
          echo "error"  
          exit 1
          ;;  
      esac  
    done  
    echo $optind  
    shift $(($optind - 1))  
    #通过shift $(($optind - 1))的处理,$*中就只保留了除去选项内容的参数,可以在其后进行正常的shell编程处理了。  
    echo $0  
    echo $*  
    执行命令:
    ./getopts.sh -a 11 -b -c  
    -a 11 -b -c  
    11  
    3  
    b 4  
    c 5  
    5  
    ./getopts.sh
    
    2.getopt
    getopt(一个外部工具)具体用用法可以#man getopt
    #-o表示短选项,两个冒号表示该选项有一个可选参数,可选参数必须紧贴选项,如-carg 而不能是-c arg
    #--long表示长选项
    例子:
    #cat getopt.sh
    #!/bin/bash
    
    # a small example program for using the new getopt(1) program.  
    # this program will only work with bash(1)  
    # an similar program using the tcsh(1) script. language can be found  
    # as parse.tcsh  
    # example input and output (from the bash prompt):  
    # ./parse.bash -a par1 'another arg' --c-long 'wow!*?' -cmore -b " very long "  
    # option a  
    # option c, no argument  
    # option c, argument `more'  
    # option b, argument ` very long '  
    # remaining arguments:  
    # --> `par1'  
    # --> `another arg'  
    # --> `wow!*?'  
    # note that we use `"$@"' to let each command-line parameter expand to a  
    # separate word. the quotes around `$@' are essential!  
    # we need temp as the `eval set --' would nuke the return value of getopt.  
    #-o表示短选项,两个冒号表示该选项有一个可选参数,可选参数必须紧贴选项  
    #如-carg 而不能是-c arg  
    #--long表示长选项  
    #"$@"在上面解释过  
    # -n:出错时的信息  
    # -- :举一个例子比较好理解:  
    #我们要创建一个名字为 "-f"的目录你会怎么办?  
    # mkdir -f #不成功,因为-f会被mkdir当作选项来解析,这时就可以使用  
    # mkdir -- -f 这样-f就不会被作为选项。  
    temp=`getopt -o ab:c:: --long a-long,b-long:,c-long::   
         -n 'example.bash' -- "$@"`  
    if [ $? != 0 ] ; then
      echo "terminating..." >&2
      exit 1
    fi  
    # note the quotes around `$temp': they are essential!  
    #会将符合getopt参数规则的参数摆在前面,其他摆在后面,并在最后面添加--  
    eval set -- "$temp"  
    #经过getopt的处理,下面处理具体选项。  
    while true
    do  
      case "$1" in  
        -a|--a-long)
          echo "option a"
          shift
          ;;  
        -b|--b-long)
          echo "option b, argument \`$2'"
          shift 2
          ;;  
        -c|--c-long)    
          case "$2" in  
            "")
              echo "option c, no argument"
              shift 2
              ;;  
            *)
              echo "option c, argument \`$2'"
              shift 2
              ;;  
          esac ;;  
        --)
          shift
          break
          ;;  
        *)
          echo "internal error!"
          exit 1
          ;;  
      esac
    done  
    echo "remaining arguments:"  
    for arg do  
      echo '--> '"\`$arg'" ;  
    done  
    运行命令:
    ./getopt.sh --b-long abc -a -c33 remain  
    option b, argument `abc'  
    option a  
    option c, argument `33'  
    remaining arguments:  
    --> `remain'  
    

      

  • 相关阅读:
    bzoj2733 永无乡 平衡树按秩合并
    bzoj2752 高速公路 线段树
    bzoj1052 覆盖问题 二分答案 dfs
    bzoj1584 打扫卫生 dp
    bzoj1854 游戏 二分图
    bzoj3316 JC loves Mkk 二分答案 单调队列
    bzoj3643 Phi的反函数 数学 搜索
    有一种恐怖,叫大爆搜
    BZOJ3566 概率充电器 概率dp
    一些奇奇怪怪的过题思路
  • 原文地址:https://www.cnblogs.com/wsjhk/p/8430975.html
Copyright © 2011-2022 走看看