通常哪个是 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/