将shell命令输出逐行解析为两个变量
Parsing a shell command output into two variables by line
我正在编写一个脚本,输出目录中 files/directories 大小的条形图。我目前正在使用
行获取所需的数据
array=($(du -sc * | sort -hr))
这导致 array
的每隔一行是一个大小,每隔一行是一个与之对应的文件名。但是,如果任何文件名包含 spaces,这种天真的方法就不起作用,因为输出在每个 space.
处被分割
基本上我想做的是逐行解析输出,这样我首先从每一行中获取字符到第一个 space(大小),然后是该行的其余部分(文件名,可能包含也可能不包含 spaces)。我考虑过在 space 和换行符之间交替使用 IFS,但想不出我该怎么做。
我希望解决方案可以在不同的 shell 之间移植,或者至少可以在 ksh 中工作。
逐行读取的方式是while read
循环,read
允许读取多个字段:
names=() sizes=()
while read -r size name
do
echo "The file '$name' has size $size"
names+=("$name")
sizes+=("$size")
done < <(du -sc ./* | sort -hr)
./*
可防止以破折号(du
)和前导空格(read
)开头的文件出现问题。
我正在编写一个脚本,输出目录中 files/directories 大小的条形图。我目前正在使用
行获取所需的数据array=($(du -sc * | sort -hr))
这导致 array
的每隔一行是一个大小,每隔一行是一个与之对应的文件名。但是,如果任何文件名包含 spaces,这种天真的方法就不起作用,因为输出在每个 space.
基本上我想做的是逐行解析输出,这样我首先从每一行中获取字符到第一个 space(大小),然后是该行的其余部分(文件名,可能包含也可能不包含 spaces)。我考虑过在 space 和换行符之间交替使用 IFS,但想不出我该怎么做。
我希望解决方案可以在不同的 shell 之间移植,或者至少可以在 ksh 中工作。
逐行读取的方式是while read
循环,read
允许读取多个字段:
names=() sizes=()
while read -r size name
do
echo "The file '$name' has size $size"
names+=("$name")
sizes+=("$size")
done < <(du -sc ./* | sort -hr)
./*
可防止以破折号(du
)和前导空格(read
)开头的文件出现问题。