2013-07-10 8 views
46

Ho uno script Bash che esegue azioni basate sul valore di una variabile. La sintassi generale del comando caso è:Come si esegue il test di una stringa vuota in un'istruzione case Bash?

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

mi piacerebbe eseguire una routine di default se non viene fornito alcun comando e do_help se il comando non viene riconosciuto. Ho provato omettendo il valore caso così:

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

Il risultato era prevedibile, suppongo:

syntax error near unexpected token `)' 

Poi ho provato ad utilizzare il mio miglior colpo a una regex:

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

Con questa , un $ {command} vuoto cade nel caso *.

Sto cercando di fare l'impossibile?

+0

come viene fornito il comando? attraverso stdin? – Oak

risposta

77

L'istruzione case utilizza glob, non regex e insiste su corrispondenze esatte.

Quindi la stringa vuota è scritto, come al solito, come "" o '':

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

Ecco uno soluzione:

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

Ovviamente è possibile utilizzare qualsiasi prefisso che ti piace.

1

Io uso una semplice caduta attraverso. nessun parametro passato ($ 1 = "") verrà catturato dal secondo caso, tuttavia il seguente * catturerà qualsiasi parametro sconosciuto. Capovolgendo "") e *) non funzionerà come *) catturerà tutto ogni volta in quel caso, anche spazi vuoti.

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

Ecco come lo faccio (a ognuno il suo):

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

Se sono alla ricerca di una subroutine che esiste in uno o due file in un file system che contiene decine di file CGI mi entra il termine di ricerca, ad es 'Ssn_format'. bash mi restituisce i risultati in un file di testo (finder.txt) che assomiglia a questo:

- ./registry/master_person_index.cgi: SQLClinic :: :: Sicurezza ssn_format ($ user, $ nome_script, $ locale, $ locale, $ ssn) se $ ssn ne "";

Problemi correlati