bash 回显包含转义字符的环境变量

bash echo environment variable containing escaped characters

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

echo $@ > file.txt

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

当我在 bash 中使用 echo 时,比如 echo "\"",它只打印 ",而当我使用 echo '"\""' 时,它会正确打印。我想也许这就是在变量周围使用单引号的解决方案,但是我无法在单引号内获取变量的值。

如果你运行echo \",bash中反斜杠的作用是转义后面的字符。这实际上使您能够使用双引号作为参数。您不能单独使用反斜杠;如果你想将反斜杠作为参数,你需要使用另一个斜杠来转义:echo \

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

请参阅此 post 以获得更好的解释:Difference between single and double quotes in Bash

首先,请注意

echo $@ > file.txt

可能会以多种方式失败。 Shellcheck identifies one problem (missing quotes on $@). See the accepted, and excellent, answer to Why is printf better than echo? 对于其他人。

其次,正如其他人所指出的,Bash 程序没有切实可行的方法来确切知道参数是如何在命令行上指定的。例如,对于所有这些调用

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

prog 中的代码将看到一个由一个双引号字符组成的 </code> 值。 <code>prog 调用中使用的任何引号字符都由父 shell 进程完成的 quote removal part of the shell expansions 删除。

通常这无关紧要。如果变量或参数包含在作为文字输入时需要引用的值(例如 "\""),则可以安全地使用它们,包括将它们作为参数传递给其他程序,方法是引用变量或参数的使用(例如 "", "$@", "$x").

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

if (( $# > 0 )) ; then
    printf -v quoted_params '%q ' "$@"  # Add all parameters to 'quoted_params'
    printf '%s\n' "${quoted_params% }"  # Remove trailing space when printing
fi >file.txt

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