【发布时间】:2016-04-05 22:45:26
【问题描述】:
我一直在阅读这篇文章:bash "for in" looping on null delimited string variable 看看我是否能够处理数组中包含空格的任意文本。
根据上面的帖子,这工作正常:
while IFS= read -r -d '' myvar; do echo $myvar; done < <(find . -type f -print0)
为了检查我的理解,我也这样做了(仍然可以正常工作):
while IFS= read -r -d '' myvar; do echo $myvar; done < <(printf "%s\0" 'a b' 'c d')
但是,然后我尝试将输出存储在一个数组中,它出错了:
IFS= read -r -d '' -a myvar < <(printf "%s\0" 'a b' 'c d')
该数组仅包含 a b 而不是 c d:
echo ${myvar[@]}
a b
显然,我在这里遗漏了一个更精细的细节。感谢您的帮助。
PS。我在跑步:
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin14)
Copyright (C) 2007 Free Software Foundation, Inc.
【问题讨论】:
-
来自
help read:从标准输入中读取一行并将其拆分为字段。 'ab\0c d` 不止一行。 -
read -a用于将单行上的单词分配到数组中。要将空分隔的行读入数组:unset arr i; while IFS= read -r -d '' 'arr[i++]'; do :; done < <(printf "%s\0" 'a b' 'c d'). -
根据定义,一行由 ascii 0 终止,对吧?例如,换行符只是一个格式化字符?
-
这个用例让我想知道为什么
readarray命令不允许您指定备用行终止符。 -
我已经实施了@4ae1e1 的建议并且效果很好。紧凑的语法
read 'arr[i++]'; do :; done对我来说是新的。谢谢。我的副作用是我还了解了以下之间的区别:
标签: arrays bash delimiter null-character