所以我有一个脚本,我想在其中使用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
自变量成为$1
,因为可以像-abc
,-a -b -c
,-ab -c
等那样给出选项,因此选项的数量与参数的数量。
理想情况下,我想避免bashisms
bash
方法是将indirection与${!VARIABLE}
一起使用-将VARIABLE
扩展到的内容视为要使用的参数,因此示例中while循环后的echo "${!OPTIND}"
将显示theargument
。
更通用的方法是使用shift
放弃选项参数,然后使用$1
等:
if [ "$OPTIND" -gt 1 ]; then
shift $((OPTIND - 1))
fi
在您的示例中,$OPTIND
在循环后为2,因此这会将位置参数左移1,丢弃-abc
并将theargument
保留在[C0]中。如果您使用$1
,-abc theargument
,-ab -c theargument
等,则此方法有效。