使用单/双引号回显一些字符串时的结果不同

时间:2016-11-28 06:52:48

标签: shell

当使用单引号成功打印时,

回显一些字符串

➜  ~ echo 'LOGIN_IDENTITY=sdf!121sdf$78sd!8'
LOGIN_IDENTITY=sdf!121sdf$78sd!8

但是当使用双引号时,它无法成功打印并更改为另一个奇怪的命令

➜  ~ echo "LOGIN_IDENTITY=sdf!121sdf$78sd!8"
➜  ~ echo "LOGIN_IDENTITY=sdffind . -name 'application.properties' | xargs  grep 'login'sdf$78sdawk '{print "\""$0"\""}' a"

双引号出了什么问题?

1 个答案:

答案 0 :(得分:1)

由于shell中的Parameter Expansion,当双引号中有!个字符时,它会尝试将其展开为有值。

摘录自man bash页面,history-expansion小节:

  

历史扩张是由历史扩张的出现引入的   字符,默认为'!'。只有'\'和'''可用于转义>历史扩张性,但历史扩张性也是   如果它紧接在a的结束双引号之前,则作为引用处理   双引号字符串。

您可以使用单引号('

来避免扩展
$ echo "LOGIN_IDENTITY=sdf!121sdf$78sd!8"
-bash: !121: event not found

将上述作业更改为

$ echo "LOGIN_IDENTITY=sdf"'!'"121sdf$78sd"'!'"8"
LOGIN_IDENTITY=sdf!121sdf8sd!8

请注意!字符周围的单引号。