如何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“”;