Как я могу проверить пустую строку в выражении 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
При этом пустая ${команда} попадает в случай *.
Я пытаюсь сделать невозможное?
Ответы
Ответ 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 "";