包含*选项时,case语句未正确执行

时间:2013-11-05 16:52:06

标签: bash case-statement

我有一个案例脚本如下:

 for i in "$@"; do
arg=( $@ )
    case $i in
 --string)
          for ((i=0; i<${#arg[@]}; i++)) ; do
           if [ "${arg[$i]}" == "--string" ] ; then
                ((i++))
                 STRING=${arg[$i]}
           fi
          done
          ;;
*)
          print_help
          exit
          ;;
  esac
done

当我运行./test --some_command --string pattern;它会打印帮助选项。 当我在字符串中运行./test --some_command --string pattern而没有*)选项时,它可以工作。

你能告诉我如何解决这个问题。

另一个例子:

#!/bin/bash

test(){

        echo i am testing this now
}

print_help()
{
  echo help
}

for i in "$@"; do
arg=( $@ )
    case $i in
 --string)
          for ((i=0; i<${#arg[@]}; i++)) ; do
           if [ "${arg[$i]}" == "--string" ] ; then
                ((i++))
                 STRING=${arg[$i]}
           fi
          done
                echo $STRING
          ;;
 --test)
        test
        ;;

 *)
          print_help
          exit
          ;;
  esac
done

当我运行./test --string pattern --test时。它打印 图案 帮助

1 个答案:

答案 0 :(得分:3)

当for循环变为“pattern”时,它不被case分支覆盖,因此它会命中默认分支并打印帮助。您必须以更智能的方式迭代参数。将for循环替换为

while (( $# > 0 )); do
    arg=$1
    shift
    case $arg in
        --string) STRING=$1; shift; echo "$STRING" ;;
        --some-command) : ;;
        --) break ;;
        *) print_help; exit ;;
    esac
done