从自定义选项中读取参数 - Bash

时间:2018-05-02 19:42:22

标签: bash shell unix

我正在尝试创建一个bash脚本并接受2个选项

  • bePort和fePort

因为这是有效的

while getopts ":a:b:" opt; do
  case $opt in
    a)
      echo "-a was triggered!, Parameter: $OPTARG" >&2
      ;;
    b)
      echo "-b was triggered!, Parameter: $OPTARG" >&2
      ;;
    \?)
      echo "Invalid option: -$OPTARG" >&2
      exit 1
      ;;
  esac
done

我跑

bash test.sh -a aaa -b bbb

我得到了

-a was triggered!, Parameter: aaa
-b was triggered!, Parameter: bbb

那么,我试过这个

while getopts ":fe:be:" opt; do
  case $opt in
    fe)
      echo "-fe was triggered!, Parameter: $OPTARG" >&2
      ;;
    be)
      echo "-be was triggered!, Parameter: $OPTARG" >&2
      ;;
    \?)
      echo "Invalid option: -$OPTARG" >&2
      exit 1
      ;;
  esac
done

但它似乎不起作用。

我跑

bash test.sh -fe 4444 -be 3333

我的提示中没有打印任何内容。

我期待看到类似的东西

-be was triggered!, Parameter: 3333
-fe was triggered!, Parameter: 4444

问题

如何继续进行调试?

我现在对任何建议持开放态度。

任何提示/建议/帮助都将非常感谢!

1 个答案:

答案 0 :(得分:4)

因为-fe 4444被解析为-f -e 4444

测试代码:

while getopts ":fe:be:" opt; do
  case $opt in
    b)
      echo "-b was triggered!, Parameter: $OPTARG" >&2
      ;;
    e)
      echo "-e was triggered!, Parameter: $OPTARG" >&2
      ;;
    f)
      echo "-f was triggered!, Parameter: $OPTARG" >&2
      ;;
    fe)
      echo "-fe was triggered!, Parameter: $OPTARG" >&2
      ;;
    be)
      echo "-be was triggered!, Parameter: $OPTARG" >&2
      ;;
    \?)
      echo "Invalid option: -$OPTARG" >&2
      exit 1
      ;;
  esac
done

输出:

$ bash test.sh -fe 4444 -be 3333
-f was triggered!, Parameter: 
-e was triggered!, Parameter: 4444
-b was triggered!, Parameter: 
-e was triggered!, Parameter: 3333

使用--fe 4444等长选项是合适的。 如何用bash解析长选项已在另一篇文章中得到解答。

- > Using getopts in bash shell script to get long and short command line options