Как проверить пустую строку в операторе bash case?
у меня есть скрипт 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.
Я пытаюсь сделать невозможное?
4 ответа:
The
case
оператор использует глобусы, а не регулярные выражения, и настаивает на точных совпадениях.так что пустая строка пишется, как обычно, как
""
или''
:case "$command" in "") do_empty ;; something) do_something ;; prefix*) do_prefix ;; *) do_other ;; esac
вот один из способов:
case _${command} in _start) do_start ;; _stop) do_stop ;; _config) do_config ;; _) do_default ;; *) do_help ;; esac
очевидно, что вы можете использовать любой префикс, который вам нравится.
Я использую простое падение. никакие переданные параметры ($1="") не будут пойманы вторым оператором case, но следующий * поймает любой неизвестный параметр. Переворачивание "") и *) не будет работать, так как*) будет ловить все каждый раз в этом случае, даже пробелы.
#!/usr/local/bin/bash # testcase.sh case "" in abc) echo "this word was seen." ;; "") echo "no word at all was seen." ;; *) echo "any 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::безопасность::ssn_format($пользователь$имя_сценария,$местная,$местная,$ССН) если $ССН нэ "";