2013-07-10 43 views
46

我有一个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 `)' 

然后我试着用我最好的拍摄在正则表达式:

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

有了这个,一个空的$ {命令}落入*情况。

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

+0

如何提供命令?通过stdin? – Oak

回答

77

case声明使用球体而不是正则表达式,并坚持精确匹配。

所以空字符串写入,像往常一样,为""''

case "$command" in 
    "")  do_empty ;; 
    something) do_something ;; 
    prefix*) do_prefix ;; 
    *)   do_other ;; 
esac 
4

这里有一个解决方法:

case _${command} in 
    _start) do_start ;; 
    _stop) do_stop ;; 
    _config) do_config ;; 
    _)  do_default ;; 
    *)  do_help ;; 
esac 

很明显,你可以使用任何你喜欢的前缀。

1

我使用通过一个简单的下跌。没有参数传递($ 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 
0

这里是我如何做到这一点(每一个自己):

#!/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'。庆典让我回来,看起来像这样的文本文件(finder.txt)结果:

- ./registry/master_person_index.cgi: SQLClinic ::安全:: ssn_format($用户,$ SCRIPT_NAME, $ local,$ Local,$ ssn)if $ ssn ne“”;

相关问题