当WORD是变量时,为什么WORD的字段拆分不会出现在`case WORD in`语句中?

时间:2016-01-20 10:57:41

标签: bash shell posix dash-shell

Shell脚本:

#!/bin/sh
a="foo  bar"

case $a in
    "foo  bar")
        echo case 1
        ;;
esac

case foo  bar in
    "foo  bar")
        echo case 2
        ;;
esac

使用bash执行此操作会导致以下输出和错误。

case 1
foo: line 10: syntax error near unexpected token `bar'
foo: line 10: `case foo  bar in'

使用dash

执行此操作
case 1
foo: 10: foo: Syntax error: word unexpected (expecting "in")` leads to the following output and error.

我不明白为什么第一个case语句成功但第二个语句不成功。

根据http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_05处的POSIX文档,在任何一种情况下都会发生字段拆分,因此在第一个$a语句中将foo bar扩展为case后,它应该相当于第二个。

所以两者都应该失败。为什么第一个case语句成功?

1 个答案:

答案 0 :(得分:3)

case 语句中使用的 word 的第一种情况下, 。来自POSIX

案件条件构造

  

条件构造案例应执行复合列表   对应于几种模式中的第一种(参见Pattern   匹配符号)与由此产生的字符串匹配   代码扩展,参数扩展,命令替换,算术   扩展,并引用删除给定的单词。

因此,无论您是否引用,它都不会被扩展,并且在没有引号的情况下是安全的。

case $a in  
   ...
esac

case "$a" in    
   ...
esac

将按预期工作。

显然,这不等于案例陈述中两个字的第二个例子。