Bash: 是否有内置的方法来获取关联数组中键的最大长度

Bash: Is there a built-in way to get the maximum length of the keys in an associative array

在Bash中,给定一个关联数组,如何找到最长键的长度?

说,我声明 myArray 如下所示:

$  declare -A myArray=([zero]=nothing [one]='just one' [multiple]='many many')
$  echo ${myArray[zero]}
nothing
$  echo ${myArray[one]}
just one
$  echo ${myArray[multiple]}
many many
$

我可以使用下面的一行代码得到它

$  vSpacePad=`for keys in "${!myArray[@]}"; do echo $keys; done | awk '{print length, [=12=]}' | sort -nr | head -1 | awk '{print }'`;
$  echo $vSpacePad
8
$

我正在寻找像下面这样更简单的东西,但不幸的是,这些只是给出了数组中的项目数。

$  echo "${#myArray[@]}"
3
$  echo "${#myArray[*]}"
3

您确实需要循环键,但不需要任何外部工具:

max=-1
for key in "${!myArray[@]}"; do
  len=${#key}
  ((len > max)) && max=$len
done
echo $max    # => 8

如果您想每行打印一个数组的元素,则不需要循环:printf 是您的朋友:

printf '%s\n' "${!myArray[@]}"

printf 迭代直到所有参数都被消耗

Is there a built-in way to get the maximum length of the keys in an associative array

没有

how do I find the length of the longest key?

遍历数组元素,获取元素长度并保留最大数。

不要使用反引号`。请改用 $(..)

引用变量扩展 - 不要 echo $keys,请 echo "$keys"。更喜欢 printf 而不是 echo.

如果数组元素没有换行符和其他可疑字符,您可以:

printf "%s\n" "${myArray[@]}" | wc -L