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

当同时使用getopts时,如何在Linux shell脚本中获取程序参数?,linux,shell,getopts,Linux,Shell,Getopts,所以我有一个脚本,我想用getopts处理选项,但我也想用通常的方式读取程序本身的参数。因此,在这个示例脚本中,我希望处理选项,然后echo参数,如/script.sh-abc theargument。出现的问题是,我不知道它是哪个shell参数。参数不应与选项相关,因此您可以调用脚本,如/script.sh参数: #!/bin/sh while getopts "abc" opt; do case $opt in a) echo "option a" ;;

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

#!/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?
我不能只
$optand
移动
参数,使其成为
$1
,因为可以给出像
-abc
-a-b-c
-ab-c
等选项,所以选项的数量与参数的数量不对应


理想情况下,我希望避免bash

bash
的方法是对
${!VARIABLE}
使用间接寻址-将
VARIABLE
扩展到的内容视为要使用的参数,因此示例中while循环后的
echo“${!optand}”
将显示
argument

更通用的方法是使用
shift
放弃选项参数,然后使用
$1
等:

if [ "$OPTIND" -gt 1 ]; then
    shift $((OPTIND - 1))
fi
在您的示例中,
$OPTIND
在循环后为2,因此这会将位置参数向左移动1,丢弃
-abc
,并将参数保留在
$1
中。如果您使用
-abc theargument
-ab-c theargument
-a-b-c theargument
,等等,这种方法是有效的