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