100

変数の値に基づいてアクションを実行する Bash スクリプトがあります。case ステートメントの一般的な構文は次のとおりです。

case ${command} in
   start)  do_start ;;
   stop)   do_stop ;;
   config) do_config ;;
   *)      do_help ;;
esac

do_helpコマンドが指定されておらず、コマンドが認識されない場合は、デフォルト ルーチンを実行したいと思います。ケースの値を省略してみました:

case ${command} in
   )       do_default ;;
   ...
   *)      do_help ;;
esac

結果は予測可能でした。

syntax error near unexpected token `)'

次に、正規表現を使用してみました:

case ${command} in
   ^$)     do_default ;;
   ...
   *)      do_help ;;
esac

これで、空がケース${command}に落ちます。*

私は不可能なことをしようとしていますか?

4

3 に答える 3

148

このcaseステートメントは、正規表現ではなくグロブを使用し、完全一致を主張します。

したがって、空の文字列は、通常どおり""orのように記述され''ます。

case "$command" in
  "")        do_empty ;;
  something) do_something ;;
  prefix*)   do_prefix ;;
  *)         do_other ;;
esac
于 2013-07-10T16:10:33.653 に答える
5

私は単純なフォールスルーを使用します。渡されたパラメーター ($1="") は 2 番目の case ステートメントによってキャッチされませんが、次の * は未知のパラメーターをキャッチします。"") と *) を反転しても機能しません。*) はその場合、毎回すべてをキャッチし、空白も含むからです。

#!/usr/local/bin/bash
# testcase.sh
case "$1" in
  abc)
    echo "this $1 word was seen."
    ;;
  "") 
    echo "no $1 word at all was seen."
    ;;
  *)
    echo "any $1 word was seen."
    ;;
esac
于 2014-04-05T00:22:01.820 に答える