如果你有一个带分隔符的字符串,比如 ,
字符,你可以像这样使用 IFS
:
text=some,comma,separated,text
IFS="," read -ra ADDR <<< "$text"
for i in ${ADDR[@]}
do
echo $i
done
每个单词将打印在一个新行中。但是,如果您获取像 ls
这样的命令的结果,然后尝试在 \n
上拆分它,您将不会得到相同的结果:
results=$(ls -la)
IFS="\n" read -ra ADDR <<< "$results"
for i in ${ADDR[@]}
do
echo $i
done
它只打印 2 行,而且它们甚至不是文件条目。这是
total
36
ls
命令输出的第一行。
有人可以帮忙吗? 如果不是正确的方法,那是怎么回事?
最佳答案
read
通常读取直到到达换行符,除非您使用 -d
另行告诉它。
在这个例子中,我们使用-d $'\0'
。这会读取 shell,直到它到达一个空字符(它不会出现在 ls
的输出中)。然后 IFS=$'\n'
导致 shell 在换行处拆分并将每一行分配为数组元素。请注意使用 $'...'
而不是 "..."
来解释转义序列。
results=$(ls -la)
IFS=$'\n' read -ra ADDR -d $'\0' <<< "$results"
for i in "${ADDR[@]}"
do
echo "$i"
done
最后但同样重要的是,我们必须引用数组和 $i
的替换。
关于linux - 如何使用 Bash 脚本拆分换行符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56095118/