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

时间:2018-06-04 10:25:09

标签: arrays bash percentage

我正在尝试编写一个自定义脚本来监视“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
我在这里错过了什么吗?任何帮助都会非常感激。

2 个答案:

答案 0 :(得分:1)

我认为你的语法过于复杂。我只是在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

答案 1 :(得分:1)

它不起作用的原因是,你将awk包含在$(...)中,告诉bash执行它的输出,因此你想要执行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电话。