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_help
jeś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?
Odpowiedzi:
case
Oś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
źródło
something|'') do_something ;;
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
źródło
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 "";
źródło