如何在Bash case语句中测试空字符串?

时间:2013-07-10 15:56:02

标签: string bash null 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

有了这个,空的$ {command}就会落到* case。

我是否想要做不可能的事?

3 个答案:

答案 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"";