Як перевірити наявність порожнього рядка в операторі Bash case?


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}потрапляє до *справи.

Я намагаюся зробити неможливе?


як виконується команда? через stdin?
Дуб

Відповіді:


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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.