Jak przetestować pusty ciąg w instrukcji Bash case?

87

Mam skrypt Bash, który wykonuje akcje na podstawie wartości zmiennej. Ogólna składnia instrukcji case jest następująca:

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

Chciałbym wykonać procedurę domyślną, jeśli nie podano polecenia i do_helpjeśli polecenie nie zostało rozpoznane. Próbowałem pominąć wartość przypadku w ten sposób:

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

Wynik był przewidywalny, jak sądzę:

syntax error near unexpected token `)'

Następnie spróbowałem użyć wyrażenia regularnego:

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

W ten sposób pusty ${command}wpada do *skrzynki.

Czy próbuję dokonać niemożliwego?

Singlestone
źródło
jak jest wydawane polecenie? przez stdin?
Oak,

Odpowiedzi:

129

caseOświadczenie używa globs, nie regexes, i kładzie nacisk na dokładną meczów.

Więc pusty ciąg jest zapisywany, jak zwykle, jako ""lub '':

case "$command" in
  "")        do_empty ;;
  something) do_something ;;
  prefix*)   do_prefix ;;
  *)         do_other ;;
esac
rici
źródło
Uwaga: działa to również w przypadku korzystania z wielu opcji:something|'') do_something ;;
yolenoyer
4

Używam prostego przejścia. żadne przekazane parametry ($ 1 = "") nie zostaną przechwycone przez drugą instrukcję case, ale następująca * będzie przechwytywać każdy nieznany parametr. Odwrócenie „”) i *) nie zadziała, ponieważ *) w takim przypadku za każdym razem złapie wszystko, nawet spacje.

#!/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
źródło
1

Oto jak to robię (dla każdego z nich):

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

Jeśli szukam podprogramu, który istnieje w jednym lub dwóch plikach w systemie plików zawierającym dziesiątki plików cgi, wpisuję wyszukiwany termin, np. „Ssn_format”. bash zwraca mi wyniki w pliku tekstowym (finder.txt), który wygląda następująco:

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

Thomas Altfather Good
źródło