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

问题描述 投票:1回答:1

所以我有一个脚本,我想在其中使用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

linux shell getopts
1个回答
1
投票

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等,则此方法有效。

© www.soinside.com 2019 - 2024. All rights reserved.