如何在内置Bash getopts的情况下使用长选项?

Hem*_*ang 33 bash getopts command-line-arguments

我试图-temp用Bash getopts 解析一个选项.我正在调用我的脚本:

./myscript -temp /foo/bar/someFile
Run Code Online (Sandbox Code Playgroud)

这是我用来解析选项的代码.

while getopts "temp:shots:o:" option; do
    case $option in
        temp) TMPDIR="$OPTARG" ;;
        shots) NUMSHOTS="$OPTARG" ;;
        o) OUTFILE="$OPTARG" ;;
        *) usage ;;
    esac
done
shift $(($OPTIND - 1))

[ $# -lt 1 ] && usage
Run Code Online (Sandbox Code Playgroud)

mco*_*ive 54

正如其他人所解释的那样,getopts并没有解析长期选择.你可以使用getopt,但它不是可移植的(它在某些平台上被破坏了......)

作为解决方法,您可以实现shell循环.这里是一个在使用标准getopts命令之前将长选项转换为short选项的示例(在我看来它更简单):

# Transform long options to short ones
for arg in "$@"; do
  shift
  case "$arg" in
    "--help") set -- "$@" "-h" ;;
    "--rest") set -- "$@" "-r" ;;
    "--ws")   set -- "$@" "-w" ;;
    *)        set -- "$@" "$arg"
  esac
done

# Default behavior
rest=false; ws=false

# Parse short options
OPTIND=1
while getopts "hrw" opt
do
  case "$opt" in
    "h") print_usage; exit 0 ;;
    "r") rest=true ;;
    "w") ws=true ;;
    "?") print_usage >&2; exit 1 ;;
  esac
done
shift $(expr $OPTIND - 1) # remove options from positional parameters
Run Code Online (Sandbox Code Playgroud)

  • 这很好,但是如果传递了无效的参数,则无法正确通知用户,而是声明"非法选项 - ".我在脚本中添加了以下内容来帮助:`" - "*)usage $ {arg}; 退出2 ;;` (4认同)

gei*_*rha 42

getopts 只能解析短期权.

大多数系统也有一个外部getopt命令,但getopt不是标准的,并且通常被设计破坏,因为它不能安全地处理所有参数(带有空格和空参数的参数),只有GNU getopt可以安全地处理它们,但只有你以GNU特定的方式使用它.

更简单的选择是不使用,只需用while循环迭代脚本的参数并自己进行解析.

有关示例,请参见http://mywiki.wooledge.org/BashFAQ/035.

  • 无需在这里重新发明轮子,只需使用 getopts 并查找其他方法来解析长参数,或者像 @mcoolive 在这里展示的那样欺骗它 (3认同)