[记录]Shell中的getopts和getopt用法

僤鯓⒐⒋嵵緔 提交于 2021-02-13 07:26:47
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'

  

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!