Как проверить наличие пустой строки в операторе case Bash?

87

У меня есть сценарий Bash, который выполняет действия на основе значения переменной. Общий синтаксис оператора case:

case ${command} in
   start)  do_start ;;
   stop)   do_stop ;;
   config) do_config ;;
   *)      do_help ;;
esac

Я хотел бы выполнить процедуру по умолчанию, если команда не указана, и do_helpесли команда не распознана. Я попытался опустить значение case таким образом:

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

Полагаю, результат был предсказуем:

syntax error near unexpected token `)'

Затем я попытался использовать регулярное выражение:

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

При этом ${command}в *корпус попадает пустое место.

Я пытаюсь сделать невозможное?

Одиночный камень
источник
как предоставляется команда? через стандартный ввод?
Oak

Ответы:

128

В caseзаявлении используются глобусы, а не регулярные выражения, и требуется точное совпадение.

Таким образом, пустая строка, как обычно, записывается как ""или '':

case "$command" in
  "")        do_empty ;;
  something) do_something ;;
  prefix*)   do_prefix ;;
  *)         do_other ;;
esac
ричи
источник
Обратите внимание, это также работает при использовании нескольких вариантов:something|'') do_something ;;
yolenoyer
4

Я использую простой провал. никакие переданные параметры ($ 1 = "") не будут перехвачены вторым оператором case, но следующий * перехватит любой неизвестный параметр. Перелистывание "") и *) не будет работать, поскольку *) в этом случае каждый раз будет ловить все, даже пробелы.

#!/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
Эрни
источник
1

Вот как я это делаю (каждому свое):

#!/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

Если я ищу подпрограмму, которая существует в одном или двух файлах в файловой системе, содержащей десятки файлов cgi, я ввожу поисковый запрос, например 'ssn_format'. bash возвращает мне результаты в текстовом файле (finder.txt), который выглядит так:

- ./registry/master_person_index.cgi: SQLClinic :: Security :: ssn_format ($ user, $ script_name, $ local, $ Local, $ ssn) if $ ssn ne "";

Томас Альтфатер Гуд
источник