在各种 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/