我通常喜欢echo
某些带有感叹号的字符串。虽然我知道如何逃避它们以防止外壳扩展,我注意到了还打印反斜杠...
echo "\!" # will print \! instead of just !
与其他工具相反sed
与其他工具才不是如果用于防止扩展可能使用的有效参数sed
,则打印反斜杠:
echo "test" | sed 's/^\(.*\)$/\1 \!/' # print -> test !
echo "test" | sed 's/^\(.*\)$/\1 !/' # also print -> test !
echo "test" | sed "s/^\(.*\)$/\1 ! /" # also print -> test !, though needed to put a space or use a backslash for it to show correctly
我怎样才能做同样的事情echo
,或者我必须使用其他工具,比如sed
?
编辑:
只是注意到使用''
而不是上面的""
示例echo
可以在!
没有 shell 扩展的情况下进行打印(带和不带反斜杠),不过:
- 当人们想要使用命令替换时,它不起作用,
echo
因为它只适用于""
...
答案1
你需要逃离它或者引用它,而不是两者:
echo \!
echo "!"
Bash 历史扩展会忽略转义感叹号、单引号感叹号以及出现在结束双引号之前的感叹号。看手册的历史交互部分了解详情。所以
echo '!'
也有效,并且不必考虑感叹号在哪里。
您可以使用printf
代替 来将单引号与变量扩展结合起来echo
。您还可以在同一命令行中组合多种形式的引用:
echo '!'"$(echo test)"
但总的来说,printf
比echo
。正如其他人提到的,您也可以完全禁用历史扩展;非交互式 shell 默认情况下不启用它。