shell 数组变量中的元素/单词数

The*_*bM8 5 bash array

我查看了如何在 SO 上使用 shell 计算字符串中的单词数的问题,它解释了如何计算变量内的单词数。

但这在我的变量中只计算一个单词,所以我不知道如何解决它。

我有以下变量:

vmfarm1=(host1.com host2.com host3.com host4.com )
maximus=(host11.com host 12.com host 13.com)
firefly=(host5.com)
Run Code Online (Sandbox Code Playgroud)

我需要找到一种方法将所有主机名计数为变量内的数字。

在此之后,被计算在内的数字必须用作该行中的变量。

我试过了:

echo "$input" | wc -w
printf ' \n|/4.vmfarm1 ' >>  textfile.txt
Run Code Online (Sandbox Code Playgroud)

我必须4自己将上述内容写入数字,并且需要自动完成,这就是为什么我需要一个变量。

Kus*_*nda 11

给定一个数组arr,其长度(元素数)由 给出${#arr[@]}

将此与您的vmfarm1阵列一起使用:

printf ' \n|/%d.vmfarm1 ' "${#vmfarm1[@]}" >>textfile.txt
Run Code Online (Sandbox Code Playgroud)


Sté*_*las 10

要在具有数组支持的各种 shell 中打印数组变量中的元素数:

  • csh/ tcsh/ zsh/ rc/ es/ akangaecho $#array
  • ksh¹/ bash¹/ zshecho "${#array[@]}"
  • fishcount $array
  • yashecho "${array[#]}"
  • Bourne/POSIX shell(其中唯一的数组是"$@"):echo "$#"

现在,对于数组变量的所有元素中以空格分隔的单词的数量,这就是您可能想要使用的地方wc -w,但您需要向它提供由至少一个空格分隔的所有元素的内容,例如:

printf '%s\n' $array:q | wc -w        # csh/tcsh
printf '%s\n' "${array[@]}" | wc -w   # ksh/bash/zsh/yash
printf '%s\n' $array | wc -w          # fish/zsh/rc/es/akanga
printf '%s\n' "$@" | wc -w            # Bourne/POSIX
Run Code Online (Sandbox Code Playgroud)

或者,您可以将元素拆分为更多以空格分隔的单词,并在 shell 本身中进行计数。


¹请注意,鉴于ksh/bash数组是稀疏的,并且每个其他 shell 中的索引都从 0 而不是 1 开始,该数字通常与数组中的最大索引不同