getopts 似乎不起作用

tri*_*lef 3 bash getopts

我正在尝试运行以下脚本getopts来解析选项,但它似乎不起作用:

#!/bin/bash
set -x
echo $@
while getopts "rf" opt
do
  case "${opt}" in
    r)
        ropt=${OPTARG}
        ;;
    f)
        fopt=${OPTARG}
        ;;
  esac
done

shift $((OPTIND -1))

echo $fopt $ropt
Run Code Online (Sandbox Code Playgroud)

我得到的输出是:

$ ./myscript.sh -f opt2 -r opt1
+ echo -f opt2 -r opt1
-f opt2 -r opt1
+ getopts rf opt
+ case "${opt}" in
+ fopt=
+ getopts rf opt
+ shift 1
+ echo

+ set +x
Run Code Online (Sandbox Code Playgroud)

你对我做错了什么有任何想法吗?

Kus*_*nda 10

您希望您的选项采用选项参数,但您不getopts知道这一点。

你应该使用

while getopts "r:f:" opt; do ...; done
Run Code Online (Sandbox Code Playgroud)

即,每个带参数的选项都应该有 :在参数字符串 to 之后getopts

您可能还希望在最后有一个默认 case分支来处理无效选项:

 *) usage >&2
    exit 1
Run Code Online (Sandbox Code Playgroud)

(错误消息(关于无效选项或缺少选项参数)将自行显示getoptsusage预计是您将定义的一个函数,用于将简短的帮助消息打印到标准输出)。

另外,不要忘记双引号所有扩展,即使$(( OPTIND - 1 )).

与最后一点相关:

  • @user000001 是的,`$IFS` 可能包含数字。这意味着该数字可以拆分为多个单词/数字。测试`n=123; ( IFS=13; echo $n )`。 (2认同)