getopts 用于解析长选项和短选项

getopts 用于解析长选项和短选项

我已经有一个仅接受短选项的脚本,并且我想扩展相同的脚本以传递相应的长选项。现有代码如下。

while getopts :t:c: name; do   
   case name
    t) first=$OPTARG;;
    c) second=$OPTARG;;
    *) echo 'Invalid option'; break;;   
   esac 
done 
SHIFT $((OPTIND-1))

这适用于短选项,但如何扩展相同的代码以允许长选项解析?

答案1

鉴于可用的选项不一致,我倾向于自行推出;例如

SWITCH=false
VAL=default
while [ "$#" -gt 0 ] ; do
  case "${1}" in
    (-s|--switch) SWITCH=true ;;
    (-v|--value)  VAL="${2}" ; shift ;;
    (-v?*)        VAL="${1#-v}" ;;
    (--value=?*)  VAL="${1#--value=}" ;;
  esac
  shift
done

答案2

这很简单,但文档仅位于getopt()Solaris 的手册页和getopts以下文档中bosh

http://schilytools.sourceforge.net/man/man1/bosh.1.html

向下滚动至 2019 年 12 月版本的第 47 页。

让我编辑你的例子:

while getopts ":t:(test)c:(call)" name; do   
    case $name in
    t) first=$OPTARG;;
    c) second=$OPTARG;;
    :) echo "Missing argument for -$OPTARG"; break;;
    *) echo 'Invalid option'; break;;   
    esac
done
shift $((OPTIND-1))

请注意,您可能需要引用包含括号的参数......

这接受-c--call

请注意,这仅适用于

  • bosh,任何操作系统上由 schilytools 维护的 POSIX 增强型 Bourne Shell
  • sh ,Solaris 10 上的旧 Bourne Shell
  • 任何操作系统上的 ksh93

bosh此外,-long如果optstring以 . 开头,还支持 UNIX 风格的长选项()

两者ksh93bosh支持以+ifoptstring开头的选项+。在这种情况下,如果程序是用 调用的,则$name包含+c而不是。c+c

BTW:仅bosh支持一种支持没有相邻短选项的长选项的方法。请参阅bosh手册页。

我是 schilytools 的作者。

相关内容