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


87

我有一个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}落到了*箱子上。

我在尝试做不可能的事吗?


如何提供命令?通过标准输入?
2013年

Answers:


128

case语句使用通配符,而不使用正则表达式,并坚持精确匹配。

因此,像往常一样,将空字符串写为""''

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

需要注意的是,在使用多种选择时也可以使用:something|'') do_something ;;
yolenoyer

4

我使用一个简单的尝试。第二个case语句不会捕获任何传递的参数($ 1 =“”),但是后面的*将捕获任何未知参数。翻转“”和*)将不起作用,因为*)在这种情况下每次都会捕获所有内容,甚至是空白。

#!/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

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'。bash将结果返回给文本文件(finder.txt),如下所示:

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.