Wie teste ich in einer Bash-case-Anweisung nach einer leeren Zeichenfolge?

86

Ich habe ein Bash-Skript, das Aktionen basierend auf dem Wert einer Variablen ausführt. Die allgemeine Syntax der case-Anweisung lautet:

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

Ich möchte eine Standardroutine ausführen, wenn kein Befehl angegeben ist und do_helpder Befehl nicht erkannt wird. Ich habe versucht, den Fallwert folgendermaßen wegzulassen:

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

Das Ergebnis war vorhersehbar, nehme ich an:

syntax error near unexpected token `)'

Dann habe ich versucht, einen regulären Ausdruck zu verwenden:

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

Damit ${command}fällt ein Leerzeichen in den *Koffer.

Versuche ich das Unmögliche zu tun?

Singlestone
quelle
Wie wird der Befehl bereitgestellt? durch stdin?
Eiche

Antworten:

127

Die caseAnweisung verwendet Globs, keine regulären Ausdrücke, und besteht auf genauen Übereinstimmungen.

So ist die leere Zeichenkette geschrieben wird , wie üblich, wie ""oder '':

case "$command" in
  "")        do_empty ;;
  something) do_something ;;
  prefix*)   do_prefix ;;
  *)         do_other ;;
esac
Rici
quelle
Als Hinweis funktioniert dies auch, wenn Sie mehrere Auswahlmöglichkeiten verwenden:something|'') do_something ;;
Yolenoyer
4

Ich benutze einen einfachen Durchfall. Keine übergebenen Parameter ($ 1 = "") werden von der zweiten case-Anweisung abgefangen, das folgende * erfasst jedoch unbekannte Parameter. Das Umdrehen von "") und *) funktioniert nicht, da *) in diesem Fall jedes Mal alles abfängt, sogar Leerzeichen.

#!/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
Ernie
quelle
1

So mache ich das (für jeden sein eigenes):

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

Wenn ich nach einer Unterroutine suche, die in einer oder zwei Dateien in einem Dateisystem mit Dutzenden von CGI-Dateien vorhanden ist, gebe ich den Suchbegriff ein, z. B. 'ssn_format'. Bash gibt mir die Ergebnisse in einer Textdatei (finder.txt) zurück, die so aussieht:

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

Thomas Altfather Gut
quelle