bash - 使用 bash 脚本在不同列中打印多个不同大小的数组
问题描述
我正在尝试生成一份关于 linux 机器状态的报告,其中包含一些摘要信息。我使用 jps 使用正在运行的应用程序实例的名称填充多个数组。然后我想将这些排序后的数组打印成 4 列,以便我们可以轻松查看运行的内容。
我使用一些条件逻辑来确定哪个数组长度最长。因为有些数组比其他数组短,所以对最长值的简单循环可能会导致数组索引越界问题。所以我想在该行没有值的列中打印一个空字符串。
下面的代码是我目前拥有的,但是当它尝试在循环内执行命令时会抛出“找不到命令”错误。这个想法是尝试使用条件逻辑来确定当前数组是否超出范围,如果是,则打印“”。
我尝试使用 ` 使其显示为代码。我也试过没有它们。我试过没有“”和他们。我试过在变量周围使用 ${ } 而没有。我也尝试使用 ( ) 围绕值和不使用。
我不太了解这段代码的幕后发生了什么,并且在用于命令行 linux 框的 Windows 机器代码上编写脚本并不容易调试。有什么建议么?
printf "| %-40s | %-40s | %-40s | %-40s |\n" "Array 1:" "Array 2:" "Array 3:" "Array 4:" >> ${OUTPUT}
for i in $(seq ${maxRows}); do
(The command below is all on one line but to make it more readable here I entered on multiple.)
printf "| %-40s | %-40s | %-40s | %-40s |\n" "`[[ ${i} > ${#Array1[@]} ]] && ("") ||
("${Array1[$i]}")`" "`[[ $i > ${#Array2[@]} ]] && "" || ${Array2[$i]}`" "`[[ $i > ${#Array3[@]} ]]
&& "" || ${Array3[$i]}`" "`[[ $i > ${#Array4[@]} ]] && "" || ${Array4[$i]}`" >> ${OUTPUT}
done
解决方案
在 bash 中,可以访问没有值的数组元素,并且将返回未定义的值,该值将显示为空字符串。无需检查单个数组索引限制。
从技术上讲,在循环中引用 printf 存在多个问题。选择:
for i in $(seq ${maxRows}); do
printf "| %-40s | %-40s | %-40s | %-40s |\n" "${Array1[$i]}" "${Array2[$i]", "${Array4[$i]}" "${Array3[$i]}" >> $OUTPUT
done
旁注:这种方法将施加 maxRows 的限制,因为它将要求列表 1 2 3 ... maxRows 适合单行。对于更高的限制
for ((i=1; i<=maxRows; i++)); do
printf "| %-40s | %-40s | %-40s | %-40s |\n" "${Array1[$i]}" "${Array2[$i]", "${Array4[$i]}" "${Array3[$i]}" >> $OUTPUT
done
推荐阅读
- javascript - 带有刀片 SourceMap 的 laravel 项目错误
- javascript - 通过异步调用在D3中调用JSON后如何保留数据?
- chocolatey - 如何查看用于使用 Chocolatey 安装已安装包的参数?
- ada - Ada 编译警告
- universe - 如何选择 TCL 中的值标记字符?
- hash - 意外失败与 :exists in raku
- unit-testing - 获取当前的 URLCodeception 并打印它
- javascript - 如何按对象值对对象数组进行排序?
- ios - 如何在 Nativescript 中翻译 actionItem
- java - GCP-PUBSUB:-sun.security.provider.certpath.SunCertPathBuilderException:无法找到请求目标的有效证书路径