У меня есть сценарий 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}
в *
корпус попадает пустое место.
Я пытаюсь сделать невозможное?
Ответы:
В
case
заявлении используются глобусы, а не регулярные выражения, и требуется точное совпадение.Таким образом, пустая строка, как обычно, записывается как
""
или''
:case "$command" in "") do_empty ;; something) do_something ;; prefix*) do_prefix ;; *) do_other ;; esac
источник
something|'') do_something ;;
Я использую простой провал. никакие переданные параметры ($ 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
источник
Вот как я это делаю (каждому свое):
#!/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 "";
источник