我查看了如何在 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
/ akanga
:echo $#array
ksh
¹/ bash
¹/ zsh
:echo "${#array[@]}"
fish
: count $array
yash
: echo "${array[#]}"
"$@"
):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 本身中进行计数。
csh
/ tcsh
(在 SPC/TAB/NL 上拆分)
(set noglob; set tmp=($array); echo $#tmp)
Run Code Online (Sandbox Code Playgroud)ksh
/ bash
/ yash
($IFS
分裂,SPC / TAB / NL默认情况下)
(set -o noglob; set -- ${array[@]}; echo "$#")
Run Code Online (Sandbox Code Playgroud)zsh
($IFS
拆分,默认SPC/TAB/NL/NUL)
echo ${#${=array}}
Run Code Online (Sandbox Code Playgroud)rc
/ es
($ifs
分裂):
tmp = `{echo $array}
echo $#tmp
Run Code Online (Sandbox Code Playgroud)fish
(计算所有非空白(根据 PCRE)字符序列):
count (string match -ar -- '\S+' $array)
Run Code Online (Sandbox Code Playgroud)伯恩/POSIX($IFS
拆分):
(set -f; set -- $@; echo "$#")
Run Code Online (Sandbox Code Playgroud)¹请注意,鉴于ksh
/bash
数组是稀疏的,并且每个其他 shell 中的索引都从 0 而不是 1 开始,该数字通常与数组中的最大索引不同
归档时间: |
|
查看次数: |
13763 次 |
最近记录: |