还使用 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
等,则此方法有效。
所以我有一个脚本,我想用 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
等,则此方法有效。