1

外壳脚本:

#!/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 文档,在任何一种情况下都会发生字段拆分,因此 after在第一个语句$a中扩展为,它应该是等效的到第二个。foo barcase

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

4

1 回答 1

3

对于case语句中使用的,在第一种情况下进行分词。从POSIX

案例条件构造

条件构造案例应执行对应于由波浪号扩展、参数扩展、命令替换、算术扩展和引号删除产生的字符串匹配的多个模式中的第一个模式(参见模式匹配表示法)的复合列表给定的词。

所以无论你是否引用这个,它都不会被扩展并且没有引号是安全的。

case $a in  
   ...
esac

case "$a" in    
   ...
esac

将按预期工作。

显然,这不等同于在 case 语句中有两个单词的第二个示例。

于 2016-01-20T11:07:10.170 回答