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
语句成功?
答案 0 :(得分:3)
在 case 语句中使用的 word 的第一种情况下, 。来自POSIX:
案件条件构造
条件构造案例应执行复合列表 对应于几种模式中的第一种(参见Pattern 匹配符号)与由此产生的字符串匹配 代码扩展,参数扩展,命令替换,算术 扩展,并引用删除给定的单词。
因此,无论您是否引用字,它都不会被扩展,并且在没有引号的情况下是安全的。
case $a in
...
esac
和
case "$a" in
...
esac
将按预期工作。
显然,这不等于案例陈述中两个字的第二个例子。