如何使用 Bash 脚本分割断行?

Vic*_*ira 6 linux bash sh ifs

如果你有一个带有分隔符的字符串,比如说一个,字符,你可以IFS这样使用:

text=some,comma,separated,text
IFS="," read -ra ADDR <<< "$text"

for i in ${ADDR[@]}
do
    echo $i
done
Run Code Online (Sandbox Code Playgroud)

每个单词将打印在新行中。但是,如果您获取类似命令的结果ls,然后尝试将其拆分为\n您不会得到相同的结果:

results=$(ls -la)
IFS="\n" read -ra ADDR <<< "$results"

for i in ${ADDR[@]}
do
    echo $i
done
Run Code Online (Sandbox Code Playgroud)

它只打印 2 行,而且它们甚至不是文件条目。这是

total
36
Run Code Online (Sandbox Code Playgroud)

命令输出的第一行ls

有人可以提供一点帮助吗?如果这不是正确的方法,那又是怎样的呢?

Mic*_*ros 6

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
Run Code Online (Sandbox Code Playgroud)

最后但并非最不重要的一点是,我们必须引用数组 和 的替换$i