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?


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

À 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

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 "";

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.