将shell命令输出解析为两个变量

问题描述 投票:0回答:1

我正在编写一个脚本,输出目录中文件/目录大小的条形图。我目前正在获取所需的数据

array=($(du -sc * | sort -hr))

这导致array的每隔一行都是一个大小,而每隔一行都有一个与之对应的文件名。但是,如果任何文件名包含空格,则这种天真的方法不起作用,因为输出在每个空格处分开。

基本上我想要做的是逐行解析输出,以便从每一行我首先获得第一个空格(大小)的字符,然后是行的其余部分(文件名,可能包含也可能不包含)空格)。我想过在空格和换行之间交替使用IFS,但想不出我会怎么做。

我希望解决方案可以在不同的shell之间移植,或者至少在ksh中工作。

shell parsing sh ksh ifs
1个回答
0
投票

逐行读取的方法是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)开头的文件出现问题。

© www.soinside.com 2019 - 2024. All rights reserved.