4

鉴于此文件

printf 'alpha\0bravo\0charlie' > delta.txt

我想将这些字段读入单独的变量。我使用空分隔符的原因是字段将包含文件路径,它可以包含除空之外的任何字符。我尝试了这些命令:

IFS= read mike november oscar < delta.txt
IFS=$'\0' read mike november oscar < delta.txt

但是这些字段没有被正确分割

$ echo $mike
alphabravocharlie
4

2 回答 2

3

赋值IFS=$'\0'不会使空字符成为分隔符,因为Bash 变量不能包含空字符IFS=$'\0'等效于IFS=,您可以通过以下方式进行验证:

bash-4.3$ IFS=$'\0'
bash-4.3$ echo ${#IFS}
0

并且IFS=根据定义意味着根本没有分词(参见Bash 参考手册)。

您可以做的是使用内置-d选项一一读取以空分隔的项目。根据链接文件,read

-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为 a 。cat delta.txt |

我知道逐一阅读很烦人,但我想不出更好的办法。

于 2015-04-27T01:41:29.667 回答
1

作为一种解决方法,我创建了这个函数

function read_loop {
  while [ "$#" -gt 0 ]
  do
    read -d '' "$1"
    shift
  done
}

示例使用

read-nul mike november oscar < delta.txt
于 2015-04-27T01:43:00.417 回答