【问题标题】:Use optional argument before options on command line in a bash script在 bash 脚本中的命令行选项之前使用可选参数
【发布时间】:2017-05-27 10:21:38
【问题描述】:

我有一个脚本 myscript 应该执行以下操作:

  1. 自行运行:myscript
  2. 带参数运行:myscript myarg
  3. 使用选项运行:myscript -a 1 -b 2 -c 3 ...
  4. 使用参数和选项运行:myscript myarg -a 1 -b 2 -c 3 ...

我无法让 4. 工作,似乎在选项前面使用参数(我从 getopts 获取)会干扰 getopts 处理所有事情的方式。

我使用的代码基本上是这样的:

while getopts "a:b:c:" opt; do
   case ${opt} in
      a)
         var_a=$OPTARG
         ;;
      ... more options here
   esac
done

if [ ! -z "$1" ] && [[ ! "$1" =~ ^- ]]; then
      ... do stuff with first argument - if it's there and it's not just an option
fi

如果这个问题有一个简单的解决方案,我将非常感谢!

【问题讨论】:

  • 你想过用 shift 来去掉第一个参数吗?
  • 这确实超级简单,谢谢!我想这个问题可以关闭,你想把它作为答案发布吗?还是我应该写一个答案?该解决方案的一个潜在缺点:必须在调用getopts 之前使用if [condition] then ... shift ... fi,这可能是一个问题(但在我的情况下不是)。
  • 除非你想支持myscript -a 1 myarg -b 2 -c 3,否则在getopts循环之前运行if [[ $1 == myarg ]]; then shift; ...; fi不会有问题。

标签: bash shell unix command-line-arguments getopts


【解决方案1】:

您可以在脚本的最后一个if 中使用shift(大致思路已经存在,因为您编写“使用第一个参数执行操作 - 如果它存在并且它不仅仅是一个选项”)。

【讨论】:

    猜你喜欢
    • 2019-07-03
    • 2013-09-28
    • 2020-05-26
    • 2014-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-21
    • 1970-01-01
    相关资源
    最近更新 更多