代码之家  ›  专栏  ›  技术社区  ›  masec

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

  •  0
  • masec  · 技术社区  · 7 年前

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

    echo $@ > file.txt

    "\"" "\"" 不管它怎么打印 " .

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

    2 回复  |  直到 7 年前
        1
  •  4
  •   pjh    7 年前

    首先,请注意

    echo $@ > file.txt
    

    可能会以几种方式失败。 Shellcheck $@ ). 看到公认的,优秀的,答案 Why is printf better than echo?

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

    中的代码 prog 会看到一个 $1 由一个双引号字符组成的值。调用时使用的任何引用字符 掠夺 quote removal 部分 shell expansions 由父shell进程完成。

    一般来说,这并不重要。如果变量或参数包含在作为文本输入时需要引用的值(例如。 "\"" "$1" , "$@" "$x" ).

    如果您需要以可重用为shell输入的方式编写变量或参数(例如,使用 eval source / . %q 格式规范 printf

    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
  •  0
  •   rje    7 年前

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

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

    有关更好的解释,请参见以下帖子: Difference between single and double quotes in Bash