如何testingBash case语句中的空string?

我有一个基于variables的值执行操作的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 `)' 

然后,我尝试在正则expression式中使用我的最佳镜头:

 case ${command} in ^$) do_default ;; ... *) do_help ;; esac 

有了这个,一个空的$ {command}就进入了*的情况。

我想要做不可能的事情吗?

case陈述使用的不是正则expression式,而是坚持精确匹配。

所以空string像往常一样写成""''

 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 

显然你可以使用任何你喜欢的前缀。

我使用一个简单的秋天。 没有parameter passing($ 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 

如果我正在search包含数十个cgi文件的文件系统中的一个或两个文件中存在的子例程,则inputsearch词,例如'ssn_format'。 bash在一个文本文件(finder.txt)中给出了我的结果,如下所示:

– ./registry/master_person_index.cgi:SQLClinic :: Security :: ssn_format($ user,$ script_name,$ local,$ Local,$ ssn)if $ ssn ne“”;