【问题标题】:getopts not working when called with an argument [duplicate]使用参数调用时getopts不起作用[重复]
【发布时间】:2018-08-22 01:59:54
【问题描述】:

这是我第一次尝试使用 getopts,到目前为止它还没有为我工作。我的脚本中的代码是:

while getopts "s:" opt; do
 case $opt in
    s) subj=$OPTARG;;
    \?) echo "Incorrect usage";;
 esac
done

echo ""
echo $subj

当我尝试像这样运行脚本时:

myScript.sh -s 100

我希望它回显我指定的主题 ID 号。到目前为止,虽然它只是给了我一个空白的声明。

【问题讨论】:

  • 无法复制,为我输出 100。你确定你正在运行正确的脚本吗? myScript.sh 要求脚本是可执行的并且在您的PATH 中的目录中,并且出于安全原因,当前工作目录通常PATH 中。
  • 啊,我明白了。我认为我的问题还在于我正在执行 source myScript.sh -s 100。当我只输入 myScript.sh -s 100 时,它就可以工作了。我不知道为什么当我输入“source”时会出现问题
  • 啊,我敢打赌它第一次是你在shell中使用source myScript.sh -s 100的时候,不是吗?计数器getopts 用于知道下一个参数不会在连续源之间重置,因此getopts 根本看不到任何要解析的参数。在再次使用 source 之前显式设置 OPTIND=1 应该会给您预期的行为。

标签: bash getopts


【解决方案1】:

getopts 使用OPTIND 的当前值来知道接下来要查看哪个参数。但是,如果您使用 source 运行脚本,则 OPTIND 永远不会在调用之间重置。您可能在第一次运行后添加了subj,因此在您第一次获取脚本时未设置其值。显式设置OPTIND=1 会修复它。

$ source myScript.sh -s 100

100
$ unset subj; source myScript.sh -s 100


$ OPTIND=1
$ source myScript.sh -s 100

100

【讨论】:

    猜你喜欢
    • 2015-04-02
    • 1970-01-01
    • 2012-03-07
    • 2017-03-03
    • 2014-04-04
    • 2018-03-03
    • 1970-01-01
    • 2015-07-19
    • 1970-01-01
    相关资源
    最近更新 更多