linux - 在 bash 脚本中,$'\0' 的计算结果是什么?为什么?

标签 linux bash shell sh

在各种 bash 脚本中,我遇到了以下内容:$'\0'

一个带有一些上下文的例子:

while read -r -d $'\0' line; do
    echo "${line}"
done <<< "${some_variable}"

$'\0' 的返回值是什么?或者,换句话说,$'\0' 的计算结果是什么?为什么?

这可能已经在其他地方得到了回答。我在发布之前进行了搜索,但是美元引号-斜杠-零引号中的字符数或有意义的单词数量有限,因此很难从 stackoverflow 搜索或谷歌中获得结果。所以,如果还有其他重复的问题,请允许一些宽限期并将它们与这个问题联系起来。

最佳答案

在 bash 中,$'\0''' 完全相同: 一个空字符串。在这种情况下使用特殊的 Bash 语法绝对没有意义。

Bash 字符串总是以 NUL 结尾,因此如果您设法将 NUL 插入字符串的中间,它将终止该字符串。在这种情况下,C-escape \0转换为 NUL 字符,然后用作字符串终止符。

-d read 的选项内置函数(定义输入的行尾字符)在其参数中期望单个字符。它不检查该字符是否为 NUL 字符,因此使用 '' 的 NUL 终止符同样会很高兴。或 $'\0' 中的显式 NUL (这也是一个 NUL 终止符,所以它可能没有什么不同)。在任何一种情况下,效果都是读取以 NUL 结尾的数据,如(例如)find 生成的的 -print0选项。

read -d '' line <<< "$var' 的特定情况下, $var 是不可能的有一个内部 NUL 字符(出于上述原因),所以 line将被设置为 $var 的整个值删除了前导和尾随空格。 (正如@mklement 指出的那样,这在建议的代码片段中并不明显,因为 read 将具有非零退出状态,即使已设置变量;read 仅在分隔符实际上是找到,并且 NUL 不能是此处字符串的一部分。)

注意两者有很大的区别

read -d '' line

read -d'' line

第一个是正确的。在第二个中,参数 word 传递给 read只是-d ,这意味着该选项将是下一个参数(在本例中为 line )。 read -d$'\0' line会有相同的行为;在任何一种情况下,空间都是必需的。 (因此,同样不需要 C 转义语法)。

关于linux - 在 bash 脚本中,$'\0' 的计算结果是什么?为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36587660/

相关文章:

arrays - 如何使用 Bash 4 将 CSV 数据转换为关联数组?

linux - 如何使用 Bash 中的变量检查文件夹是否相同?

bash - "source"shell 脚本中的命令不起作用

bash - s 表达式的 jq 或 xsltproc 替代方案?

bash - 你如何使用负偏移量在 bash 中获取字符串的后缀?

bash - 在 bash 中请求用户输入来设置变量

linux - 如何在 HDFS 中存储 shell 脚本的日志文件

linux - 在附加到 tee 的重定向中获取嵌套命令的退出状态

linux - linux 服务器的 tcl 中不同数量的变量名和字段说明符错误

windows - "conda: command not found",Windows 上的 Bash