2012-10-15 153 views
3

为什么这个命令行工作:感叹号

$ output='Irrelevant'; if [[ $output =~ Something ]]; then echo "I found something in the output." ; fi 

而这一次给我一个奇怪的语法错误?

$ output='Irrelevant'; if [[ $output =~ Something ]]; then echo "I found something in the output!" ; fi 
-bash: !": event not found 

从第一个版本的唯一的变化是这句话里面引号里回荡着一个感叹号结束。 为什么Bash在第二个版本中给我这个错误?

在如此重要的情况下,这是从bash --version输出:

GNU bash, version 4.2.24(1)-release (x86_64-pc-linux-gnu) 
+0

相关:https://stackoverflow.com/questions/6697753/difference-between-single-and-double-quotes-in-bash – codeforester

回答

5

你可以用单引号代替双引号的字符串。

感叹号调用bash manual中描述的非常有用的历史扩展功能。

历史扩展是由历史扩展字符的外观引入的,默认为!。只有\'可用于逃避历史扩展字符。

例如,执行以单词mysql类型开始最后的命令是:

!mysql 

或执行包含单词grep的最后一个命令,输入:

!?grep 

bash手册还记录了history expansion operators的语法。

+0

我其实知道历史扩张。但没有连接点。谢谢! – Deleted