【问题标题】:bash echo environment variable containing escaped characters包含转义字符的 bash echo 环境变量
【发布时间】:2019-03-23 18:43:36
【问题描述】:

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

echo $@ > file.txt

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

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

【问题讨论】:

  • 你可以sort of do this,但这既不实用也没有用处。这个问题通常只是因为人们误解了引号和参数而出现,所以如果你解释了让你想这样做的问题,你可能会得到一个更简单、更有帮助的答案。

标签: linux bash printf echo


【解决方案1】:

首先,请注意

echo $@ > file.txt

可能会以多种方式失败。 Shellcheck 确定一个问题($@ 上缺少引号)。其他人请参阅Why is printf better than echo? 接受的优秀答案。

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

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

prog 中的代码将看到由一个双引号字符组成的 $1 值。调用prog 时使用的任何引用字符都被父shell 进程完成的shell expansionsquote removal 部分删除。

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

如果您需要将变量或参数以可重复用作 shell 输入的方式编写(例如,使用 evalsource/.),则在按字面输入时需要引用的变量或参数存在问题. Bash 支持 %q 格式规范到 printf 内置来处理这种情况。目前尚不清楚 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”。如果不需要,则需要更改代码。

【讨论】:

    【解决方案2】:

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

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

    查看这篇文章以获得更好的解释:Difference between single and double quotes in Bash

    【讨论】:

    • 这是我的问题。我知道反斜杠是为了逃避。但是我想要做的是在不考虑转义的情况下直接打印任何给定的输入。当我将输入放在单引号内时,Echo 会这样做。但是我不能在我的脚本中这样做,因为输入在一个变量中。
    • Bash 将参数传递给您的脚本 插值和替换之后,换句话说,在所有转义已经完成并且在变量的值已经扩展等之后. 从你的脚本内部,不可能确切地知道用户在命令行上输入了什么。
    • 对此有任何参考吗?如果是这样的话,那么我想正如你所说的那样,这是不可能的。但我怀疑。
    猜你喜欢
    • 1970-01-01
    • 2023-03-07
    • 2021-03-31
    • 2019-05-15
    • 2016-10-03
    • 2013-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多