Come si verifica una stringa vuota in un'istruzione case Bash?


87

Ho uno script Bash che esegue azioni in base al valore di una variabile. La sintassi generale dell'istruzione case è:

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

Vorrei eseguire una routine predefinita se non viene fornito alcun comando e do_helpse il comando non è riconosciuto. Ho provato a omettere il valore del caso così:

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

Il risultato era prevedibile, suppongo:

syntax error near unexpected token `)'

Quindi ho provato a usare una regex:

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

Con questo, un vuoto ${command}cade sul *caso.

Sto cercando di fare l'impossibile?


come viene fornito il comando? attraverso stdin?
Oak

Risposte:


129

L' caseistruzione utilizza glob, non regex e insiste sulle corrispondenze esatte.

Quindi la stringa vuota viene scritta, come al solito, come ""o '':

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

Come nota, questo funziona anche quando si utilizzano scelte multiple:something|'') do_something ;;
yolenoyer

4

Uso una semplice caduta. nessun parametro passato ($ 1 = "") verrà catturato dalla seconda istruzione case, tuttavia il seguente * catturerà qualsiasi parametro sconosciuto. Capovolgere "") e *) non funzionerà poiché *) catturerà tutto ogni volta, anche gli 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

1

Ecco come lo faccio (a ciascuno il proprio):

#!/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 cerco una subroutine che esiste in uno o due file in un filesystem contenente dozzine di file cgi, inserisco il termine di ricerca, ad esempio "ssn_format". bash mi restituisce i risultati in un file di testo (finder.txt) che assomiglia a questo:

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.