arrays - Bash Looping 2 Arrays with whitespaces in variables

标签 arrays linux bash for-loop

我正在编写一个脚本来查找服务器上目录的磁盘使用情况。 我需要处理名称中包含空格的文件夹。

我在使用 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 个数组 dirstorage

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/

相关文章:

Bash 语法错误 : unexpected end of file

bash - sleep 后如何使用 Heredoc 发送一些输入?

javascript - 考虑数组的长度,对数组相应的索引值进行平均

java - fedora core 5下如何让java应用程序显示中文

java - 从依赖于外部库的终端运行 java

linux - 命令在 linux 终端中有效,但在 shell 脚本中无效

linux - 如何检查文件是否存在但在 shell 脚本的路径中间泛化?

javascript - 嵌套数组过滤,有没有更优雅的方式?

c - 在 C 编程中将值从字符数组传输到整数数组

Javascript 计算重复项和唯一项并添加到数组