web-dev-qa-db-ja.com

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

変数の値に基づいてアクションを実行する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}は*ケースにフォールスルーします。

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

69
Singlestone

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

したがって、空の文字列は通常どおり、""または''

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

単純なフォールスルーを使用します。渡されたパラメーター($ 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
3
Ernie

ここに私がそれを行う方法があります(それぞれに):

#!/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 "";