【问题标题】:Bash: Is there a built-in way to get the maximum length of the keys in an associative arrayBash:是否有内置方法来获取关联数组中键的最大长度
【发布时间】:2021-07-16 18:20:28
【问题描述】:

在 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, $0}' | sort -nr | head -1 | awk '{print $1}'`;
$  echo $vSpacePad
8
$

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

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

【问题讨论】:

    标签: arrays bash max maxlength associative


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 这仍然需要循环。我想避免for循环。感谢printf 的提示
    • @vtbr 您必须在 forkloop 之间做出选择!根据数组中元素的数量,对于小数组,loopfork 快!! (注:maxlen=$(printf "%s\n" "${!array[@]}" | wc -L) 暗示至少有 2 个分叉!
    【解决方案2】:

    是否有一种内置方法可以获取关联数组中键的最大长度

    没有。

    如何找到最长键的长度?

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

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

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

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

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

    【讨论】:

    • 使用您的printfwc 组合,我的单行大小大大减小了。我要使用这个。不过,我必须为密钥 "${!myArray[@]}" 这样做。
    • 字符长度的字节长度? printf "A\342\226\200b\n" | LANG=C wc -L -> 2,但是printf "A\342\226\200b\n" | LANG=en_US.utf8 wc -L -> 3!!见Length of string in bash
    • Length in byte of length in char? 嗯,它不仅是 utf-8,wc 还处理 tabs (printf "\t\n" | wc -L -> 8) 和 CR (printf "123\r123\n" | wc -L = 3) 和类似的。
    猜你喜欢
    • 1970-01-01
    • 2018-01-16
    • 2010-09-29
    • 2015-10-24
    • 2020-04-11
    • 2016-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多