将 for 循环的输出保存在 Bash 的数组中
Saving the output of a for loop in an array in Bash
我正在尝试编写自定义脚本来监控"n" 台服务器的磁盘使用情况space。我有两个数组,一个数组包含实际使用情况,另一个数组包含允许的限制。我想遍历使用过的存储阵列;确定百分比,将其四舍五入为最接近的整数并在控制台上输出相同的值,以便稍后保存在数组中。
我有以下代码可以执行此操作:
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 中的索引对应于同一服务器上的限制。
虽然上面的语句按预期运行,但我看到如下 "command not found error",这导致这些输出未保存在 "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
它不起作用的原因是,当你在 $(...)
中包含 awk 时,你告诉 bash 执行它的输出,因此你想执行 8
或 4
和 bash 错误告诉你它没有找到这样的命令。只是不要将 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
)
无论如何,Glenn 的回答显示了 'good' 方法,无需 readarray
调用。
我正在尝试编写自定义脚本来监控"n" 台服务器的磁盘使用情况space。我有两个数组,一个数组包含实际使用情况,另一个数组包含允许的限制。我想遍历使用过的存储阵列;确定百分比,将其四舍五入为最接近的整数并在控制台上输出相同的值,以便稍后保存在数组中。
我有以下代码可以执行此操作:
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 中的索引对应于同一服务器上的限制。
虽然上面的语句按预期运行,但我看到如下 "command not found error",这导致这些输出未保存在 "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
它不起作用的原因是,当你在 $(...)
中包含 awk 时,你告诉 bash 执行它的输出,因此你想执行 8
或 4
和 bash 错误告诉你它没有找到这样的命令。只是不要将 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
)
无论如何,Glenn 的回答显示了 'good' 方法,无需 readarray
调用。