【问题标题】:How do I escape a series of backslashes in a bash printf?如何在 bash printf 中转义一系列反斜杠?
【发布时间】:2015-09-22 07:58:05
【问题描述】:

以下脚本产生了意外的输出:

printf "escaped slash: \\ \n"
printf "2 escaped slashes: \\\\ \n"
printf "3 escaped slashes: \\\\\\ \n"
printf "4 escaped slashes: \\\\\\\\ \n"

在 Ubuntu 14 下作为 bash 脚本运行,我明白了:

escaped slash: \
2 escaped slashes: \ 
3 escaped slashes: \\ 
4 escaped slashes: \\

错误.. 什么?

【问题讨论】:

    标签: string bash escaping backslash


    【解决方案1】:

    printf 是内置的 bash。看help printf

    printf [-v var] 格式 [参数] 在 FORMAT 的控制下格式化和打印 ARGUMENTS。

    您应该传递格式和参数。所以在参数前加上"%s\n"的格式:

    printf "%s\n" "escaped slash: \\"
    printf "%s\n" "2 escaped slashes: \\\\"
    printf "%s\n" "3 escaped slashes: \\\\\\"
    printf "%s\n" "4 escaped slashes: \\\\\\\\"
    

    输出:

    转义斜线:\ 2个转义斜杠:\\ 3 个转义斜杠:\\\ 4 个转义斜线:\\\\

    【讨论】:

    • @Yuri G.:感谢您的补充说明。
    • 请注意,这是有效的,因为您避免 printf 应用另一轮反斜杠解释。
    【解决方案2】:

    假设printf FORMAT 字符串用双引号括起来,printf 与例如echo(都是 shell 内置命令)。

    您对printf 的期望实际上可以使用单引号来实现:

    printf '1 escaped slash:   \\ \n'
    printf '2 escaped slashes: \\\\ \n'
    printf '3 escaped slashes: \\\\\\ \n'
    printf '4 escaped slashes: \\\\\\\\ \n'
    

    输出:

    1 escaped slash:   \
    2 escaped slashes: \\
    3 escaped slashes: \\\
    4 escaped slashes: \\\\
    

    【讨论】:

    • 请注意,这是有效的,因为您可以防止 bashprintf 看到参数之前删除任何反斜杠。
    • @chepner:我同意。似乎评估的顺序是:1)bash 扩展了FORMAT 字符串(只有用双引号括起来!)。 2) printfARGUMENTSFORMAT 组合成一个字符串。 3) 最后的字符串再次展开(即 \\ 变为 \ )。 4) 最终打印出结果。
    • 关闭; printf 在插入参数之前只处理FORMAT;比较 printf '\n'printf '%s' '\n'
    猜你喜欢
    • 2016-08-07
    • 2022-11-28
    • 1970-01-01
    • 2012-10-03
    • 2015-03-29
    • 1970-01-01
    • 2021-05-29
    • 1970-01-01
    相关资源
    最近更新 更多