我有一个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 `)'
然后我尝试在正则表达式中使用我最好的镜头:
case ${command} in
^$) do_default ;;
...
*) do_help ;;
esac
有了这个,空的$ {command}就会落到* case。
我是否想要做不可能的事?
答案 0 :(得分:100)
case
语句使用整数而不是正则表达式,并坚持完全匹配。
所以空字符串像往常一样写成""
或''
:
case "$command" in
"") do_empty ;;
something) do_something ;;
prefix*) do_prefix ;;
*) do_other ;;
esac
答案 1 :(得分:2)
我使用简单的堕落。没有参数传递($ 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
答案 2 :(得分:1)
这是我如何做到的(对每个人来说):
#!/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&#39 ;. bash将结果返回到文本文件(finder.txt)中,如下所示:
- ./registry/master_person_index.cgi: SQLClinic :: Security :: ssn_format($ user,$ script_name,$ local,$ Local,$ ssn)if $ ssn ne"";