bash Parse命令行选项

时间:2017-10-04 18:00:02

标签: bash

有人可以告诉我如何使用getopt解析以下命令行选项吗?

myCmd [[-f <file> | -k | -v] -e <env> -h help]

其中

fkv是互斥的。 fe都需要参数,但kv不需要参数。

所以命令可以是:

  • mycmd -f file -e aaa或
  • mycmd -v -e aaa或
  • mycmd -k -e aaa

我尝试了以下内容:

while getopts "f:kve:" o
    do
    case "$o" in
       f | k | v) process_file ;;
       k) process_key ;;
       v) process_var ;;
       e) process_env ;;
       *) print_help ;;
    esac
 done;

这似乎不起作用。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

您需要自己添加该逻辑。这是未经测试的:

file=""
has_k=false
has_v=false
env=""

while getopts "f:kve:" opt; do
    case "$opt" in
        f) file="$OPTARG" ;;
        k) has_k=true ;;
        v) has_v=true ;;
        e) env="$OPTARG" ;;
        *) print_help; exit 1 ;;
    esac
done
shift $((OPTIND - 1))

if  ( [[ -n $file ]] && $has_k ) ||
    ( [[ -n $file ]] && $has_v ) ||
    ( $has_k && $has_v )
then
    echo "May only specify one of -f,-k,-v"
    print_help
    exit 1
fi