Comment tester une chaîne vide dans une instruction de cas Bash?

87

J'ai un script Bash qui effectue des actions basées sur la valeur d'une variable. La syntaxe générale de l'instruction case est:

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

Je voudrais exécuter une routine par défaut si aucune commande n'est fournie et do_helpsi la commande n'est pas reconnue. J'ai essayé d'omettre la valeur de cas ainsi:

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

Le résultat était prévisible, je suppose:

syntax error near unexpected token `)'

Ensuite, j'ai essayé d'utiliser une regex:

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

Avec cela, un vide ${command}tombe à travers le *boîtier.

Est-ce que j'essaye de faire l'impossible?

Singlestone
la source
comment la commande est-elle fournie? par stdin?
Oak

Réponses:

128

L' caseinstruction utilise des globs, pas des expressions régulières, et insiste sur les correspondances exactes.

Ainsi, la chaîne vide est écrite, comme d'habitude, comme ""ou '':

case "$command" in
  "")        do_empty ;;
  something) do_something ;;
  prefix*)   do_prefix ;;
  *)         do_other ;;
esac
rici
la source
À noter, cela fonctionne également lorsque vous utilisez plusieurs choix:something|'') do_something ;;
yolenoyer
4

J'utilise une simple chute. aucun paramètre passé ($ 1 = "") ne sera intercepté par la deuxième instruction case, mais le * suivant attrapera tout paramètre inconnu. Le fait de retourner "") et *) ne fonctionnera pas car *) attrapera tout à chaque fois dans ce cas, même les blancs.

#!/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
la source
1

Voici comment je fais (à chacun le sien):

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

Si je recherche un sous-programme qui existe dans un ou deux fichiers dans un système de fichiers contenant des dizaines de fichiers cgi, j'entre le terme de recherche, par exemple «ssn_format». bash me donne les résultats dans un fichier texte (finder.txt) qui ressemble à ceci:

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

Thomas Altfather Bon
la source