Подтвердить что ты не робот

Как я могу проверить пустую строку в выражении case Bash?

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

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

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

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

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

syntax error near unexpected token `)'

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

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

При этом пустая ${команда} попадает в случай *.

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

4b9b3361

Ответ 1

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

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

case "$command" in
  "")        do_empty ;;
  something) do_something ;;
  prefix*)   do_prefix ;;
  *)         do_other ;;
esac

Ответ 2

Здесь один способ:

case _${command} in
   _start)  do_start ;;
   _stop)   do_stop ;;
   _config) do_config ;;
   _)       do_default ;;
   *)       do_help ;;
esac

Очевидно, вы можете использовать любой префикс, который вам нравится.

Ответ 3

Я использую простое проваливание. никакие параметры не передаются ($ 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

Ответ 4

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

#!/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), если $ssn ne "";