Arrays 尝试获取数组的长度有什么问题?

Arrays 尝试获取数组的长度有什么问题?,arrays,linux,bash,Arrays,Linux,Bash,脚本具有以下功能: #/bin/bash path_elements=$(echo $PATH | tr ":" " ") echo ${#path_elements[*]} 我的路径变量包含多个目录。但是,运行时,输出将返回: 一, 为什么这不返回$PATH中的目录数?需要什么来解决这个问题?您只需要读取一个字符串,其中用空格代替冒号(用空格替换文本制表符,扩展全局表达式,以及您可能不想要的各种其他行为);因此,当您询问数组path_elements中存在多少字符串时,您得到的答案是1,因为

脚本具有以下功能:

#/bin/bash
path_elements=$(echo $PATH | tr ":" " ")
echo ${#path_elements[*]}
我的路径变量包含多个目录。但是,运行时,输出将返回:

一,


为什么这不返回$PATH中的目录数?需要什么来解决这个问题?

您只需要读取一个字符串,其中用空格代替冒号(用空格替换文本制表符,扩展全局表达式,以及您可能不想要的各种其他行为);因此,当您询问数组
path_elements
中存在多少字符串时,您得到的答案是1,因为只有一个字符串(根本不是数组)


现在,这个是一个数组,也是一种解读它的最佳实践方式:

# This is the best-practices approach.
IFS=: read -r -a path_elements <<<"$PATH"
echo "${#path_elements[@]}"
#这是最佳实践方法。

IFS=:read-r-a path_元素如果你想变得尖刻,你可以回答“没什么;你得到的数组长度是正确的”。虽然
[*]
而不是
[@]
在风格上不一定是最佳实践——在两者确实存在语义差异的情况下,后者几乎总是可取的;允许将常规参数视为长度为1的数组只是一个奇怪之处。
# This is a buggy antipattern that does, at least, create an array
path_elements=( $(tr ':' ' ' <<<"$PATH") )
echo "${#path_elements[@]}"