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

Sin*_*one 70 string bash null case

我有一个Bash脚本,它根据变量的值执行操作.case语句的一般语法是:

case ${command} in
   start)  do_start ;;
   stop)   do_stop ;;
   config) do_config ;;
   *)      do_help ;;
esac
Run Code Online (Sandbox Code Playgroud)

如果没有提供命令,我想执行默认例程,如果命令无法识别,我想执行do_help.我试着省略案例值:

case ${command} in
   )       do_default ;;
   ...
   *)      do_help ;;
esac
Run Code Online (Sandbox Code Playgroud)

结果是可以预测的,我想:

syntax error near unexpected token `)'
Run Code Online (Sandbox Code Playgroud)

然后我尝试在正则表达式中使用我最好的镜头:

case ${command} in
   ^$)     do_default ;;
   ...
   *)      do_help ;;
esac
Run Code Online (Sandbox Code Playgroud)

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

我想做不可能的事吗?

ric*_*ici 110

case声明使用了整数,而不是正则表达式,并坚持完全匹配.

所以空字符串像往常一样写成""'':

case "$command" in
  "")        do_empty ;;
  something) do_something ;;
  prefix*)   do_prefix ;;
  *)         do_other ;;
esac
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这在使用多个选择时也有效:`something|'') do_something ;;` (4认同)
  • @PeterMortensen:在 shell 脚本中,需要解释的是缺少引号;引用扩展是不言而喻的。我本可以省略引号,但我选择不这样做,因此不必解释为什么可以这样做。(而且我实际上并不能 100% 确定不存在极端情况。) (2认同)

小智 5

我使用简单的跌倒。没有传递的参数 ($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
Run Code Online (Sandbox Code Playgroud)