2013-07-10 24 views
46

Mam skrypt Bash, który wykonuje akcje na podstawie wartości zmiennej. Ogólna składnia oświadczenia przypadku jest:Jak przetestować pusty ciąg w instrukcji Bash case?

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

Chciałbym wykonać domyślną procedurę jeśli komenda nie jest zapewnione, a do_help czy polecenie jest nierozpoznany. Próbowałem pomijając wartość przypadek tak:

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

Wynik był do przewidzenia, jak sądzę:

syntax error near unexpected token `)' 

Potem spróbował wykorzystać mój najlepszy strzał w regex:

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

Z tego , puste $ {command} przechodzi do * przypadku.

Czy próbuję zrobić niemożliwe?

+0

w jaki sposób dostarczane jest polecenie? przez stdin? – Oak

Odpowiedz

77

Oświadczenie case używa globów, a nie wyrażeń regularnych i nalega na dokładne dopasowanie.

więc pusty ciąg jest napisane, jak zwykle, jako "" lub '':

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

Oto jeden obejście:

case _${command} in 
    _start) do_start ;; 
    _stop) do_stop ;; 
    _config) do_config ;; 
    _)  do_default ;; 
    *)  do_help ;; 
esac 

Oczywiście można używać niezależnie od prefiksu chcesz.

1

Używam prostego poprzez upadek. żaden parametr przekazany ($ 1 = "") nie zostanie przechwycony przez drugą instrukcję case, jednak poniższe * spowoduje przechwycenie dowolnego nieznanego parametru. Odbicie "") i *) nie będzie działało jak *) będzie za każdym razem łapało wszystko, nawet puste.

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

Oto jak to zrobić (aby każdy własne):

#!/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 plików w systemie plików zawierającym kilkadziesiąt plików cgi wejdę wyszukiwane hasło, np "ssn_format". bash daje mi wyniki w pliku tekstowym (finder.txt), który wygląda tak:

- ./registry/master_person_index.cgi: SQLClinic :: Bezpieczeństwo :: ssn_format ($ user, $ nazwa_skryptu, $ local, $ Local, $ ssn), jeśli $ ssn ne "";