【问题标题】:How to get program argument in a Linux shell script when also using getopts?在使用 getopts 时如何在 Linux shell 脚本中获取程序参数?
【发布时间】:2020-07-28 17:51:20
【问题描述】:

所以我有一个脚本,我想用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】:

    bash 方法是使用 indirection${!VARIABLE} - VARIABLE 扩展为被视为要使用的参数,因此在示例中的 while 循环之后 echo "${!OPTIND}" 将显示theargument

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

    if [ "$OPTIND" -gt 1 ]; then
        shift $((OPTIND - 1))
    fi
    

    在您的示例中,$OPTIND 在循环之后为 2,因此这会将位置参数向左移动 1,丢弃 -abc 并将 theargument 留在 $1 中。如果您使用-abc theargument-ab -c theargument-a -b -c theargument 等,则此方法有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-14
      • 1970-01-01
      • 1970-01-01
      • 2022-01-13
      • 1970-01-01
      • 1970-01-01
      • 2014-03-14
      相关资源
      最近更新 更多