鉴于此文件
printf 'alpha\0bravo\0charlie' > delta.txt
我想将这些字段读入单独的变量中。我使用的原因 null分隔符是因为字段将包含可以包含的文件路径 除null之外的任何字符。我尝试了这些命令:
IFS= read mike november oscar < delta.txt
IFS=$'\0' read mike november oscar < delta.txt
但是字段没有正确分割
$ echo $mike
alphabravocharlie
答案 0 :(得分:3)
分配IFS=$'\0'
不会使空字符成为分隔符,因为Bash variables cannot hold null characters。 IFS=$'\0'
相当于IFS=
,您可以通过执行以下操作进行验证:
bash-4.3$ IFS=$'\0'
bash-4.3$ echo ${#IFS}
0
根据定义,IFS=
表示根本没有分词(请参阅Bash Reference Manual)。
您可以使用read
builtin的-d
选项逐个读取空分隔项。根据链接文档,
-d delim
delim
的第一个字符用于终止输入行,而不是换行符。
我们可以使用delim
的空字符串来获得所需的行为。
示例(我冒昧地在你的例子中添加空格来演示它如何实现想要的东西 - 没有在空格上分割):
bash-4.3$ printf 'alpha with whitespace\0bravo with whitespace\0charlie with whitespace' > delta.txt
bash-4.3$ { read -r -d '' mike; IFS= read -r -d '' november; IFS= read -r -d '' oscar; echo $mike; echo $november; echo $oscar; } < delta.txt
alpha with whitespace
bravo with whitespace
charlie with whitespace
我还使用-r
选项在输入文件中保留反斜杠。当然,您可以在开头用< delta.txt
替换cat delta.txt |
。
我知道逐一阅读是令人讨厌的,但我无法想到更好的事情。
答案 1 :(得分:1)
作为一种解决方法,我创建了这个函数
.parent
使用示例
function read_loop {
while [ "$#" -gt 0 ]
do
read -d '' "$1"
shift
done
}