bash - 在 bash 中测试空白列表的最佳方法?

标签 bash

通常哪个是 bash 中的最佳实践?

hotstrings=()

if [ ${#hotstrings[@]} != 0 ]; then return; fi

对比

if [ ${#hotstrings[@]} -gt 0 ]; then return; fi

对比

if [ "${hotstrings[@]}" != '' ]; then return; fi

对比

还有别的吗?

最佳答案

与空字符串的比较看起来很脆弱,并且不必要地将一个可能很大的数组插入到一个字符串中,只是为了将它与空字符串进行比较。

我不确定一般情况下数字或字符串与零的比较是否更有效,而且孤立地看,即使存在差异,您也很难察觉到任何差异。我的直觉是字符串更有效,而算术需要 Bash 做一些额外的工作。

以下快速测试似乎证实了这一点:

bash$ array=({1..10000})
bash$ echo "${#array[@]}"
10000
bash$ time for i in {1..10000}; do [ "${#array[@]}" -gt 0 ]; done

real    0m0.109s
user    0m0.097s
sys 0m0.007s
bash$ time for i in {1..10000}; do [ "${#array[@]}" != 0 ]; done

real    0m0.100s
user    0m0.092s
sys 0m0.007s

对于同类比较,您应该正确测量 -ne(数字非等价)而不是 -gt,但它似乎并没有有任何真正的区别。如果说有什么不同的话,它似乎稍微慢了一些,这让我有些惊讶。

因此,对于这种相当特别的测量,我会犹豫地推荐字符串比较 != 0 而不是算术比较。但是,在 [ 上切换到 [[ 会产生更大的差异,并且启动起来更健壮。

bash$ time for i in {1..10000}; do [[ "${#array[@]}" != 0 ]]; done

real    0m0.065s
user    0m0.064s
sys 0m0.001s

(作为记录,我确实检查过 -gt 0 在这种情况下也稍微慢一些。)

无论如何,如果您的典型值与我猜测的对快速测试有用的值大不相同,或者如果您的 Bash 版本与我的不同,则测试结果可能明显不同。 (这是 Bash 3.2.57(1)-release,MacOS 仍然开箱即用。)如果这真的很重要,请使用您自己的代表性数据进行测试。

所有这些构造至少都兼容 Bash v2;显然,如果您根本不使用 Bash,那么您的问题定义不明确(Zsh 和 ksh 具有相似的数组语法,但您几乎不想尝试保持它们之间的兼容性)。

最低基线:

bash$ time for i in {1..10000}; do true; done

real    0m0.062s
user    0m0.047s
sys 0m0.006s

关于bash - 在 bash 中测试空白列表的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70846032/

相关文章:

linux - bash中间接引用数组的访问范围

linux - ssh嵌套登录到其他ssh

python - Bash 正在等待 python 子进程

bash - 如何使用 Bash 合并 Docker Compose 文件

bash - 在 bash 4 中递增变量会触发 EXIT,但在 bash 3 中不会

linux - 具有 OR 逻辑语法的 bash IF 条件

bash - 如何为在 bash 中提示输入密码的命令提供密码?

python - 通过 ssh 验证文件是否存在

java - 启动 Java 应用程序一次并 hibernate 更好,还是重复启动和终止更好?

xml - 使用 grep/sed 从 XML 文件中查找单词