Como faço para testar uma string vazia em uma instrução de caso Bash?

87

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_helpse 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?

Singlestone
fonte
como o comando está sendo fornecido? por meio de stdin?
Oak

Respostas:

128

A caseinstruçã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
rici
fonte
Como observação, isso funciona bem ao usar escolhas múltiplas:something|'') do_something ;;
yolenoyer
4

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
Ernie
fonte
1

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

Thomas Altfather Good
fonte