bash echo环境变量,包含转义字符

时间:2018-10-18 21:22:03

标签: linux bash printf echo

我有一个脚本,可以将给定的输入回显到文件中,如下所示:

echo $@ > file.txt

当我传递类似"\""的字符串时,我希望它精确地将"\""打印到文件中,但是会打印"。 我的问题是如何在不考虑转义的情况下打印包含字符串的变量的所有字符?

当我在echo "\""这样的bash中使用echo时,它仅打印",而当我使用echo '"\""'时,它将正确打印。我以为可能是在变量周围使用单引号的解决方案,但是我无法在单引号内获取变量的值。

2 个答案:

答案 0 :(得分:3)

首先,请注意

echo $@ > file.txt

可能以多种方式失败。 Shellcheck标识了一个问题($@上缺少引号)。查看其他人对Why is printf better than echo?的公认且出色的答案。

第二,正如其他人指出的那样,Bash程序没有实际的方法来确切知道如何在命令行中指定参数。例如,对于所有这些调用

prog \"
prog "\""
prog '"'

prog中的代码将看到一个$1值,该值由一个双引号字符组成。父shell进程完成的quote removalshell expansions部分将删除在调用prog中使用的所有引号字符。

通常没关系。如果变量或参数包含以文字形式输入时需要加引号的值(例如"\""),则可以安全地使用它们,包括通过引用变量或参数的用法(例如将{作为参数传递给其他程序) {1}},"$1""$@")。

如果您需要以某种变量或参数的形式写它们以用作shell输入(例如,使用"$x"eval / source)。 Bash支持.内置的%q格式规范来处理这种情况。目前尚不清楚OP试图做什么,但该问题的一种可能解决方案是:

printf

当不提供位置参数时,将创建一个空的“ file.txt”。如果这不是必需的,则需要更改代码。

答案 1 :(得分:0)

如果运行echo \",则bash中的反斜杠的功能是在其后转义该字符。实际上,这使您可以使用双引号作为参数。您不能单独使用反斜杠。如果您想使用反斜杠作为参数,则需要使用另一个斜杠将其转义:echo \\

现在,如果您想创建一个不转义这些字符串的字符串,请使用单引号:echo '\'

请参阅这篇文章以获取更好的解释:Difference between single and double quotes in Bash