arrays - 如何使用描述性/可读语句获取 BASH 数组长度?
问题描述
似乎在 BASH 中获取数组长度的标准方法是使用${#myArray[@]}
,如下所示:
myArray=( 1 3 5 7 9 )
length=${#myArray[@]}
echo "length: $length" # length: 5
不过,这种语法令人作呕的神秘和不可读。count( $myArray )
有没有类似于,myArray.length
等的内置方法?
解决方案
你可以很容易地实现 count "${myArray[@]}"
,如果这会让你感觉更好:
count() { echo "$#"; }
length=$(count "${myArray[@]}")
...或者,作为不需要命令替换(以及随之而来的性能损失)来分配结果的替代方案:
assignCount() {
local -n assignCount_arr=$2
printf -v "$1" %s "${#assignCount_arr[@]}"
}
assignCount length myArray
但是,这并不能完全使语法变得简单和干净——如果通过省略引号、f/e 来滥用它,那么其内容可能被解释为 glob 表达式或其内容包含 IFS 中的字符的数组可能会返回不正确的值.
坦率地说,bash 不是一种易于使用的语言,并且试图将其视为一种易于使用的语言会导致许多严重的错误。与不了解执行模型和语法的来龙去脉而让人们自满并留下重大错误相比,让“这里有龙”预先可见要明智得多。
推荐阅读
- ruby - nil:NilClass ruby 的未定义方法“gsub”
- django - 是否可以使用 URL args 在 Django CBV 中编辑“字段”类变量?
- r - R:list.files 返回 NA 而不是文件名
- python - Visual Studio + Jupyter:无法连接到 Jupyter 笔记本。http://localhost:8888/ 错误:内核 Python 3.8.2 64 位不可用
- javascript - 如何在这个 Javascript 计数器中添加逗号?
- uwp - 如何在 2 行中显示 PivotItem
- c++ - 我无法在 xaudio2 中播放两次声音
- sql - THING 的每日活动计数来自详细说明 THING 变化的行
- scala - 字符串scala中的ReplaceAll正则表达式模式
- c++ - 将编译时 C 回调转换为编译时 C++ 回调