Bashのcaseステートメントで空の文字列をテストするにはどうすればよいですか?


87

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

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

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

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

結果は予測可能だったと思います。

syntax error near unexpected token `)'

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

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

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

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


コマンドはどのように提供されていますか?stdinを介して?
オーク

回答:


128

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

したがって、空の文字列は、通常どおり、""または'':として書き込まれます。

case "$command" in
  "")        do_empty ;;
  something) do_something ;;
  prefix*)   do_prefix ;;
  *)         do_other ;;
esac

注意として、これは複数の選択肢を使用する場合にも機能します。something|'') do_something ;;
yolenoyer19年

4

シンプルなフォールスルーを使用しています。渡されたパラメーター($ 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

1

これが私がそれをする方法です(それぞれに):

#!/bin/sh

echo -en "Enter string: "
read string
> finder.txt
echo "--" >> finder.txt

for file in `find . -name '*cgi'`

do

x=`grep -i -e "$string" $file`

case $x in
"" )
     echo "Skipping $file";
;;
*)
     echo "$file: " >> finder.txt
     echo "$x" >> finder.txt
     echo "--" >> finder.txt
;;
esac

done

more finder.txt

数十のcgiファイルを含むファイルシステム内の1つまたは2つのファイルに存在するサブルーチンを検索する場合は、「ssn_format」などの検索語を入力します。bashは、次のようなテキストファイル(finder.txt)で結果を返します。

--./registry/master_person_index.cgi:SQLClinic :: Security :: ssn_format($ user、$ script_name、$ local、$ Local、$ ssn)if $ ssn ne "";

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.