我正在尝试编写一小段代码,将一个小公式传递给另一个程序,但是我发现当公式以11 *开始时会发生奇怪的事情(:
$ echo 11*15
整齐地打印'11 * 15'
$ echo 21*(15)
整齐地打印'21 *(15)',而
echo 11*(15)
只给'11'。据我所知,这只发生在'11 *('。我知道这可以通过使用正确的引号来解决,但我仍然很好奇为什么会这样。
有人知道吗?
答案 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)” 匹配除了给定模式之外的任何内容。