Eu tenho um script Bash que executa ações com base no valor de uma variável. A sintaxe geral da instrução case é:
case ${command} in
start) do_start ;;
stop) do_stop ;;
config) do_config ;;
*) do_help ;;
esac
Gostaria de executar uma rotina padrão se nenhum comando for fornecido e do_help
se o comando não for reconhecido. Tentei omitir o valor do caso assim:
case ${command} in
) do_default ;;
...
*) do_help ;;
esac
O resultado era previsível, suponho:
syntax error near unexpected token `)'
Então tentei usar um regex:
case ${command} in
^$) do_default ;;
...
*) do_help ;;
esac
Com isso, um vazio ${command}
cai na *
caixa.
Estou tentando fazer o impossível?
Respostas:
A
case
instrução usa globs, não regexes, e insiste em correspondências exatas.Portanto, a string vazia é escrita, como de costume, como
""
ou''
:case "$command" in "") do_empty ;; something) do_something ;; prefix*) do_prefix ;; *) do_other ;; esac
fonte
something|'') do_something ;;
Eu uso uma queda simples. nenhum parâmetro passado ($ 1 = "") será capturado pela segunda instrução case, mas o seguinte * capturará qualquer parâmetro desconhecido. Inverter "") e *) não funcionará como *), todas as vezes nesse caso, mesmo os espaços em branco.
#!/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
fonte
Veja como faço isso (para cada um):
#!/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
Se estou procurando uma sub-rotina que existe em um ou dois arquivos em um sistema de arquivos contendo dezenas de arquivos cgi, eu insiro o termo de pesquisa, por exemplo, 'ssn_format'. bash me devolve os resultados em um arquivo de texto (finder.txt) que se parece com este:
- ./registry/master_person_index.cgi: SQLClinic :: Security :: ssn_format ($ user, $ script_name, $ local, $ Local, $ ssn) if $ ssn ne "";
fonte