Как проверить пустую строку в операторе bash case?
у меня есть скрипт Bash, который выполняет действия на основе значения переменной. Общий синтаксис оператора 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 `)'
затем я попытался использовать свой лучший выстрел в regex:
case ${command} in
^$) do_default ;;
...
*) do_help ;;
esac
С этим, пустое ${command} попадает в * случай.
Я пытаюсь сделать невозможное?
4 ответов
на 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.цги: SQLClinic:: Security:: ssn_format ($user,$script_name,$local,$Local,$ssn), если $ssn ne "";