11 *(...)作为不带引号的bash参数

时间:2011-08-21 23:39:55

标签: bash shell

我正在尝试编写一小段代码,将一个小公式传递给另一个程序,但是我发现当公式以11 *开始时会发生奇怪的事情(:

$ echo 11*15

整齐地打印'11 * 15'

$ echo 21*(15)

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

echo 11*(15)

只给'11'。据我所知,这只发生在'11 *('。我知道这可以通过使用正确的引号来解决,但我仍然很好奇为什么会这样。

有人知道吗?

2 个答案:

答案 0 :(得分:2)

您的计划如何编码?如果它编码为接受参数,那么传递你的公式

./myprogram "11*15"

echo '11*15' | myprogram

如果您在命令行上执行回音,则可能会无意中显示文件名中包含11的文件

答案 1 :(得分: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):

  

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

     

`?(PATTERN-LIST)”        匹配给定模式的零次或一次。

     

'*(PATTERN-LIST)”        匹配给定模式的零次或多次。

     

`+(PATTERN-LIST)”        匹配给定模式的一个或多个实例。

     

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

     

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