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_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 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?
Réponses:
L'
case
instruction 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
la source
something|'') do_something ;;
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
la source
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 "";
la source