将 for 循环的输出保存在 Bash 中的数组中



我正在尝试编写一个自定义脚本来监视"n"台服务器的磁盘使用空间。我有两个数组,一个数组包含实际使用情况,另一个数组包含允许的限制。我想遍历使用的存储阵列;确定百分比,将其四舍五入到最接近的整数,并在控制台上输出相同的整数,以便稍后保存在数组中。

我有以下代码段可以执行此操作:

readarray -t percentage_storage_limit <<< "$(for ((j=0; j < ${#storage_usage_array[@]}; j++));    
do $(awk "BEGIN {   
ac=100*${storage_usage_array[$j]}/${storage_limit_array[$j]};    
i=int(ac);   
print (ac-i<0.5)?i:i+1    
}");    
done)";

storage_usage_array和storage_limit_array的长度相同。storage_usage_array 中的索引对应于服务器上使用的存储,storage_limit_array上的索引对应于同一服务器上的限制。

尽管上述语句按预期运行,但我看到如下"找不到命令错误",这导致这些输出未保存在"percentage_storage_limit"数组中。

8: command not found
4: command not found

我在这里错过了什么吗?任何帮助将不胜感激。

我认为你在语法方面变得过于复杂。我只会在 for 循环中累积数组

percentage_storage_limit=()
for ((j=0; j < ${#storage_usage_array[@]}; j++)); do 
percentage_storage_limit+=( $(
awk -v u="${storage_usage_array[$j]}" -v l="${storage_limit_array[$j]}" '
BEGIN {   
ac = 100 * u / l
i = int(ac)   
print (ac-i < 0.5) ? i : i+1    
}
'
) )
done

它不起作用的原因是,当你告诉bash执行它的输出$(...),你把awk括起来,因此你想执行84,并向你猛击错误,它没有找到这样的命令。只是不要将awk括在$(...)中,您想捕获它的输出,而不是执行它的输出。最好使用< <(...)然后<<<"$(...)"

readarray -t percentage_storage_limit < <(
for ((j=0; j < ${#storage_usage_array[@]}; j++)); do
awk "BEGIN {   
ac=100*${storage_usage_array[$j]}/${storage_limit_array[$j]};    
i=int(ac);   
print (ac-i<0.5)?i:i+1    
}";
done
)

无论如何,格伦的回答显示了做到这一点的"好"方法,无需readarray电话。

最新更新