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

kyo*_*kyo 2 unix bash shell

我正在尝试创建一个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
Run Code Online (Sandbox Code Playgroud)

我跑

bash test.sh -a aaa -b bbb

我有

-a was triggered!, Parameter: aaa
-b was triggered!, Parameter: bbb
Run Code Online (Sandbox Code Playgroud)

所以,我尝试了这个

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
Run Code Online (Sandbox Code Playgroud)

但这似乎不起作用。

我跑

bash test.sh -fe 4444 -be 3333

提示中什么也没打印。

我原本希望看到这样的东西

-be was triggered!, Parameter: 3333
-fe was triggered!, Parameter: 4444
Run Code Online (Sandbox Code Playgroud)

人们将如何进一步调试呢?

set*_*ut1 5

因为它-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
Run Code Online (Sandbox Code Playgroud)

输出:

$ 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
Run Code Online (Sandbox Code Playgroud)

使用诸如的长选项是适当的--fe 4444。如何用bash解析长选项已在另一篇文章中回答。

-> 在bash shell脚本中使用getopts获取长和短命令行选项

  • @ set0gut1没有内置方法。要么完全手动解析参数(自己遍历“ $ @”`),要么使用第三方库。 (3认同)