web-dev-qa-db-fra.com

Comment tester une chaîne vide dans une instruction Bash case?

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 la suivante:

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_help si 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 mon meilleur coup sur une expression régulière:

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

Avec cela, une $ {commande} vide tombe dans le cas *.

Suis-je en train de faire l'impossible?

69
Singlestone

L'instruction case utilise des globes, 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
107
rici

J'utilise une simple chute. aucun paramètre passé ($ 1 = "") ne sera détecté par la deuxième instruction case, mais le * suivant capturera tout paramètre inconnu. Retourner les "") et *) ne fonctionnera pas car *) va tout attraper à 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
3
Ernie

Voici comment je le fais (à chacun d'eux):

#!/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 ex. '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 "";

1