我正在编写一个脚本来查找服务器上目录的磁盘使用情况。 我需要处理名称中包含空格的文件夹。
我在使用 for 循环遍历每个带空格的变量时遇到问题,因为它会将它们视为两个单独的变量。
当前片段:
scandest="/root/*"
usedest="/root/fileusage/diskusage"
diskusage=$(du -sh $scandest > $usedest)
dir=($(cat $usedest|cut -f2|cut -c7-))
storage=($(cat $usedest|cut -f1))
echo "${dir[@]}"
这将输出以下内容:
anaconda-ks.cfg
file test
fileusage
install.log
install.log.syslog
文件“文件测试”将在我的循环中运行后被拆分。
因此,如果我可以在每个变量周围加上引号来回应这一点,那么我就可以继续了。或者,如果有人对我要实现的目标有更好的想法,我会洗耳恭听!
谢谢
编辑2
循环包含 2 个数组 dir 和 storage
for ((i=0;i<${#dir[@]};i++)); do
echo "${dir[$i]}" -- "${storage[$i]}"
done
依次输出:
anaconda-ks.cfg -- 4.0K
file -- 0
test -- 16K
fileusage -- 12K
install.log -- 4.0K
install.log.syslog --
如您所见,“文件测试”被视为两个变量。
最佳答案
假设您的数组已正确填充,您的循环应该只是:
for d in "${dir[@]}"; do
# do something with "$d", e.g.
echo "$d"
done
在循环顶部的数组扩展周围使用双引号,并记得在使用时引用循环变量。
但是,在您的示例中,$dir
似乎不是数组。
我建议将您的代码更改为:
while read -r junk dir rest; do
d=${dir:6}
# use "$d" here
done < /root/fileusage/diskusage
这会读取文件的每一行,分成三个变量。第二个,$dir
,包含第二个字段,它应该等同于 cut -f2
的输出。 ${dir:6}
从变量中删除前 6 个字符。
关于arrays - Bash Looping 2 Arrays with whitespaces in variables,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38973368/