我想写一小段代码将一个小公式传递给另一个程序,但是我发现公式启动时发生了一些奇怪的事情与11 *(:11 *(...)作为bash参数不带引号
$ echo 11*15
整齐打印'11 * 15'
$ echo 21*(15)
整齐打印'21 *(15)”,而
echo 11*(15)
只给出'11'。至于我发现这只发生在'11 *('。我知道这可以通过使用适当的引号来解决,但我仍然好奇为什么会发生这种情况。
有谁知道吗?
我想写一小段代码将一个小公式传递给另一个程序,但是我发现公式启动时发生了一些奇怪的事情与11 *(:11 *(...)作为bash参数不带引号
$ echo 11*15
整齐打印'11 * 15'
$ echo 21*(15)
整齐打印'21 *(15)”,而
echo 11*(15)
只给出'11'。至于我发现这只发生在'11 *('。我知道这可以通过使用适当的引号来解决,但我仍然好奇为什么会发生这种情况。
有谁知道吗?
你的程序是如何编码的?如果它的编码采取的参数,然后通过你的公式一样
./myprogram "11*15"
或
echo '11*15' | myprogram
如果回声,就像在命令行上,你可以无意中显示文件名中有11
的文件
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)' 匹配除给定模式之外的任何内容。
你有一个叫做11的文件吗? – Joshua
一个名为'11'的文件不能解释这种行为 - 事实上我想不出任何会发生什么。我得到了'bash:附近的意外标记附近的语法错误'(''。 –
'echo 11 *'print什么? –