GNU bash,版本 4.4.19(1)-release (x86_64-pc-linux-gnu)
想法是将变量设置为 NUL 分隔的数据集。这里$samples
然而,这会导致:
警告:命令替换:输入中忽略的空字节
做的时候:
samples="$(find . -type d -iregex './sample[0-9][0-9]' -printf "%f\0" | sort -z)"
以为我可以重复使用这个变量,因为我需要多次迭代相同的值:
while IFS= read -rd '' sample; do
echo $sample
done<<< "$samples"
在这种确切的情况下,我可以在find\n
命令中使用over ,但我想知道如果可能的话,一般来说如何使用 NUL 分隔符来做到这一点。\0
或者我可以这样做:
while IFS= read -rd '' sample; do
echo $sample
done< <(find . -type d -iregex './E[0-9][0-9]' -printf "%f\0" | sort -z)
但是 - 因为我需要循环它几次它会产生一些非常冗余的代码 - 并且每次都必须运行find和sort命令。
也许将结果转换为数组?
- 这可能吗?
- 为什么不能按原样使用 NUL 分隔的数据?
\0
事实上,由于底层 C 实现,您不能在 bash 字符串上下文中存储空字节。请参阅为什么 $'\0' 或 $'\x0' 是空字符串?应该是空字符,不是吗?.一种选择是在排序命令之后去除空字节,在管道结束时使用
tr
并存储结果以解决引发警告消息的直接问题。但这仍然会使您的逻辑有缺陷,因为带有换行符的文件名仍然会被破坏。使用数组,使用
mapfile
orreadarray
命令(在 bash 4.4+ 上)直接从find
命令中获取结果bash
Shell 不支持您想要执行的操作。zsh
外壳开箱即用。