还使用 getopts 时如何在 Linux shell 脚本中获取程序参数?

How to get program argument in a Linux shell script when also using getopts?

所以我有一个脚本,我想用 getopts 处理选项,但我也想以通常的方式读取程序本身的参数。所以在这个示例脚本中,我想处理选项,然后 echo 参数,如 ./script.sh -abc theargument。出现的问题是我不知道是哪个 shell 参数。参数不应与选项相关,因此您也可以像 ./script.sh theargument 一样调用脚本:

#!/bin/sh

while getopts "abc" opt; do
    case $opt in
        a) echo "option a" ;;
        b) echo "option b" ;;
        c) echo "option c" ;;
    esac
done

echo # what?

我不能只 shift$OPTIND 论证使其成为 </code> 因为选项可以像 <code>-abc, -a -b -c, -ab -c 等等,所以选项的数量与参数的数量不对应。

理想情况下,我想避免 bashism

bash 方法是使用 间接 ${!VARIABLE} - VARIABLE 扩展到的内容被视为要使用的参数,所以echo "${!OPTIND}" 在您的示例中的 while 循环之后将显示 theargument.

更通用的方法是使用shift丢弃选项参数,然后使用</code>等:</p> <pre><code>if [ "$OPTIND" -gt 1 ]; then shift $((OPTIND - 1)) fi

在你的例子中 $OPTIND 是循环后的 2,所以这会将位置参数左移 1,丢弃 -abc 并在 </code> 中留下 <code>theargument .如果您使用 -abc theargument-ab -c theargument-a -b -c theargument 等,则此方法有效。