AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 564998
Accepted
Adam
Adam
Asked: 2020-01-31 12:30:44 +0800 CST2020-01-31 12:30:44 +0800 CST 2020-01-31 12:30:44 +0800 CST

为什么 printf 不转义换行符?

  • 772
$ printf "hi"
hi$ printf "hi\n"
hi
$ printf "hi\\n"
hi

为什么最后一行不打印hi\n?

bash newlines
  • 3 3 个回答
  • 5838 Views

3 个回答

  • Voted
  1. Best Answer
    JdeBP
    2020-01-31T12:52:03+08:002020-01-31T12:52:03+08:00

    这与你所给予的论点无关printf,而与一切有关。printf

    在双引号字符串中,shell\\变成\. 因此,您给出的参数printf实际上是hi\n,然后它当然printf会执行自己的转义序列处理。

    在双引号字符串中,\shell 完成的转义特别限于影响 ␊、\、`、$和"字符。您会发现它按原样\n传递。printf所以你给出的论点printf实际上hi\n 又是。

    小心将转义序列放入printf. 只有一些在Single Unix Specification中有定义的含义。 \n例如,已定义,但\c实际上并未定义。

    进一步阅读

    • https://unix.stackexchange.com/a/359510/5132
    • POSIX Shell:在双引号内,是否存在 `\` 无法转义 `$`、```、`"`、`\` 或 `<newline>` 的情况?
    • 为什么使用引号时显示单个反斜杠
    • 回显新行和字符串开头 \t
    • 为什么破折号扩展 \\\\ 与 bash 不同?
    • https://unix.stackexchange.com/a/558665/5132
    • 31
  2. Kusalananda
    2020-01-31T12:41:11+08:002020-01-31T12:41:11+08:00

    在双引号内,\\n是一个转义(带引号)的反斜杠,后跟一个n. 这被赋予printfas\n并将printf输出一个换行符。

    在双引号内(仍然),\n是字符串\n。同样,printf接收一个\n字符串并打印一个换行符。

    在双引号内,反斜杠仅在另一个反斜杠、换行符或任何$,`或". “特殊”意味着它删除了下一个字符的特殊含义。如果反斜杠在任何其他字符之前(n例如),那么它只是一个反斜杠字符。

    这在POSIX 标准中进行了解释。

    \n要以printf格式字符串打印,请使用printf '\\n'or printf "\\\\n",或使用printf '%s' '\n'

    通常,printf格式字符串应该是单引号,并且任何变量数据都应该作为附加参数提供,以插入到格式字符串中:

    printf 'This is how you write a newline: %s\n' '\n'
    
    • 16
  3. user232326
    2020-02-02T09:08:56+08:002020-02-02T09:08:56+08:00

    好的,让我们添加另一个观点。

    这里有两个层次的解释。一个是shell,另一个是命令(在这种情况下printf)对收到的参数的解释。

    在双引号内shell 将不理会大多数序列的反斜杠字符,这是常见的结果:

    $ printf '%s\n'    "\a \b \c \d ... \z     \$ \` \\ "
    \a \b \c \d ... \z     $ ` \
    

    除了, $,`和\which 对 shell 很特别,将它们\删除。

    因此,测试您使用的字符串(和其他字符串),我们得到:

    $ printf '%s\n'     "hi\n"     "hi\\n"    "hi\\\n"    "hi\\\\n"    "hi\\\\\n"
    hi\n
    hi\n
    hi\\n
    hi\\n
    hi\\\n
    

    shell 将对转换\\为一个\。\n并独自离开\n。

    现在,printf与第一个参数有特殊关系,它被明确设置为the format。在格式参数中,一些字符是特殊的(对于 printf),例如:以%字符开头的有效序列和一些反斜杠字符序列,例如:

    \\  \a  \b  \f  \n  \r  \t  \v  and the special \ddd
    

    因此,字符串会\n生成一个换行符,但\\n不会:

    $ printf "    hi\n    hi\\n    hi\\\n   hi\\\\n"; echo
    hi
    hi
    hi\n   hi\n
    
    • 1

相关问题

  • 通过命令的标准输出以编程方式导出环境变量[重复]

  • 从文本文件传递变量的奇怪问题

  • 虽然行读取保持转义空间?

  • `tee` 和 `bash` 进程替换顺序

  • 运行一个非常慢的脚本直到它成功

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve