2011-08-21 109 views
1

我想写一小段代码将一个小公式传递给另一个程序,但是我发现公式启动时发生了一些奇怪的事情与11 *(:11 *(...)作为bash参数不带引号

$ echo 11*15 

整齐打印'11 * 15'

$ echo 21*(15) 

整齐打印'21 *(15)”,而

echo 11*(15) 

只给出'11'。至于我发现这只发生在'11 *('。我知道这可以通过使用适当的引号来解决,但我仍然好奇为什么会发生这种情况。

有谁知道吗?

+1

你有一个叫做11的文件吗? – Joshua

+1

一个名为'11'的文件不能解释这种行为 - 事实上我想不出任何会发生什么。我得到了'bash:附近的意外标记附近的语法错误'(''。 –

+0

'echo 11 *'print什么? –

回答

2

你的程序是如何编码的?如果它的编码采取的参数,然后通过你的公式一样

./myprogram "11*15" 

echo '11*15' | myprogram 

如果回声,就像在命令行上,你可以无意中显示文件名中有11的文件

+0

+1你一定要在它周围加引号,为什么你会选择不呢?引用一个字符串的想法是一个shell参数是为了避免这样的情况,它会在shell中意外触发其他东西而不是回显相同的确切字符串。 Bash shell文档状态:*引用用于删除某些字符或单词对shell的特殊含义。引用可用于禁用特殊字符的特殊处理,以防止保留字被识别,并防止参数扩展。* – darvids0n

+0

我没有想过检查主目录中是否有以11开头的文件名然而。我查了一下,只有一个名为11的文件。删除它后,echo正常工作。当然,引号会起作用,但我的好奇心是满意的。 – Chris

0

11*(15)使用特定于Bash的扩展glob语法。你偶然发现了它,强调为什么引号是一个好主意。 (我也学到了不少追查为什么它为我工作不同。感谢那个)

echo 11*(15) 

在bash会根据extglob是否启用改变的行为。如果启用*(PATTERN-LIST)匹配零次或多次出现的模式。如果它被禁用,它不会,并且由此产生的(可能会导致语法错误。

例如:

$ ls 
11 115 1155 11555 115555 
$ shopt -u extglob 
$ echo 11*(55) 
bash: syntax error near unexpected token `(' 
$ shopt -s extglob 
$ echo 11*(55) 
11 1155 115555 
$ 

(这解释奇数行为我在注释中所讨论的。)

从在bash 4.2.8文档(info bash)报价:

如果`extglob'shell选项使用`shopt'内建来启用, 几个扩展模式匹配操作符被识别。在以下描述中的 中,PATTERN-LIST是由`|'分隔的一个或多个 模式的列表。使用 一个或多个以下子图案可以形成复合图案:

'?(图案列表)' 匹配给定图案的零次或一次出现。

`*(PATTERN-LIST)' 匹配零个或多个出现的给定模式。

`+(模式列表)' 匹配一个或多个出现的给定模式。

`@(PATTERN-LIST)' 匹配给定模式之一。

`!(PATTERN-LIST)' 匹配除给定模式之外的任何内容。