如何在输出中回显感叹号而不使用反斜杠以防止扩展

如何在输出中回显感叹号而不使用反斜杠以防止扩展

我通常喜欢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)"

但总的来说,printfecho。正如其他人提到的,您也可以完全禁用历史扩展;非交互式 shell 默认情况下不启用它。

相关内容