linux - 如何使用 Bash 脚本拆分换行符?

标签 linux bash sh ifs

如果你有一个带分隔符的字符串,比如 , 字符,你可以像这样使用 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/

相关文章:

c - 修复 ms 编译器 c 代码以在 gcc 中编译

linux - 颠覆 : File properties

java - 如何使用java代码检查服务是否正在linux机器上运行

linux - 获取所有 IP 地址的 Bash 脚本

linux - tar :cannot stat : No such file or directory when shell script run

c - 链接到静态库的多个版本

python - 合并目录树的最快方法

php - 错误替换 Bash : how to write a heredoc to a dynamically created file (variable)?

linux - 如何使用 xargs 删除 iptables 规则?

bash - 代码不适用于 sh -c,但直接适用于 sh