102 votes

Comment tester la présence d'une chaîne vide dans une instruction case de Bash ?

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

J'aimerais 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 la casse ainsi :

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

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

syntax error near unexpected token `)'

J'ai ensuite essayé d'utiliser une expression rationnelle :

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

Avec cela, un vide ${command} tombe sur le * cas.

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

152voto

rici Points 45980

En case utilise des globes, et non des regex, et insiste sur les correspondances exactes.

La chaîne vide s'écrit donc, comme d'habitude, comme suit "" o '' :

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

5voto

Ernie Points 1

J'utilise une simple solution de repli. Aucun paramètre passé ($1="") ne sera pris en compte par la deuxième instruction case, mais la suivante * prendra en compte tout paramètre inconnu. L'inversion de "") 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

1voto

Zero Piraeus Points 10214

Voici une solution de contournement :

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

Vous pouvez évidemment utiliser le préfixe de votre choix.

1voto

Voici comment je m'y prends (chacun son truc) :

#!/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 une sous-routine qui existe dans un ou deux fichiers dans un système de fichiers contenant des dizaines de fichiers cgi, je saisis le terme recherché, par exemple 'ssn_format'. bash me renvoie 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 "" ;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X