Dado um array arr
, seu comprimento (número de elementos) é dado por ${#arr[@]}
.
Usando isso com sua matriz vmfarm1
:
printf ' \n|/%d.vmfarm1 ' "${#vmfarm1[@]}" >>textfile.txt
Analisei a questão Como contar número de palavras de String usando o shell no SO, o que explica como contar palavras dentro de uma variável.
Mas isso só conta uma palavra dentro da minha variável, então não tenho ideia de como corrigi-la.
Eu tenho as seguintes variáveis:
vmfarm1=(host1.com host2.com host3.com host4.com )
maximus=(host11.com host 12.com host 13.com)
firefly=(host5.com)
Eu preciso encontrar uma maneira de contar todos os nomes de host em um número dentro das variáveis.
Depois disso, o número dentro do que foi contado deve ser usado como uma variável nessa linha.
Eu tentei:
echo "$input" | wc -w
printf ' \n|/4.vmfarm1 ' >> textfile.txt
Eu tenho que escrever o 4
acima por mim para o número e eu preciso que seja feito automaticamente, é por isso que eu preciso de uma variável.
Para imprimir o número de elementos em uma variável de matriz em vários shells com suporte a matriz:
csh
/ tcsh
/ zsh
/ rc
/ es
/ akanga
: echo $#array
ksh
¹ / bash
¹ / zsh
: echo "${#array[@]}"
fish
: count $array
yash
: echo "${array[#]}"
"$@"
): echo "$#"
Agora, para o número de palavras delimitadas por espaço em branco em todos os elementos de uma variável de matriz, é nesse local que você pode usar wc -w
, mas precisa fornecer o conteúdo de todos os elementos separados por pelo menos um espaço em branco, por exemplo, com:
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
Ou você pode dividir os elementos em mais palavras delimitadas por espaços em branco e contá-las no próprio shell.
csh
/ tcsh
(dividido em SPC / TAB / NL)
(set noglob; set tmp=($array); echo $#tmp)
ksh
/ bash
/ yash
( $IFS
divisão, SPC / TAB / NL por padrão)
(set -o noglob; set -- ${array[@]}; echo "$#")
zsh
( $IFS
divisão, SPC / TAB / NL / NUL por padrão)
echo ${#${=array}}
rc
/ es
( $ifs
divisão):
tmp = '{echo $array}
echo $#tmp
fish
(conta todas as sequências de caracteres que não são espaços em branco (de acordo com o PCRE)):
count (string match -ar -- '\S+' $array)
Bourne / POSIX ( $IFS
splitting):
(set -f; set -- $@; echo "$#")
¹ observe que, dado que as matrizes ksh
/ bash
são esparsas e têm índices que começam em 0 em vez de 1 em cada outro shell, esse número geralmente não será o mesmo que o índice máximo no array
No Bash e no ksh, expandir um array como se fosse uma variável de string normal, fornece o primeiro elemento do array. Ou seja, $somearray
é o mesmo que ${somearray[0]}
. (*)
Então,
somearray=(foo bar doo)
echo "$somearray"
echo "$somearray" | wc -w
imprime foo
e 1
, pois foo
é apenas uma palavra. Se você tivesse somearray=("foo bar doo" "acdc abba")
, então o wc
mostraria três palavras.
Você precisará usar "${somearray[@]}"
para expandir todos os elementos da matriz como palavras de shell distintas (argumentos) ou "${somearray[*]}"
para expandi-las como uma única palavra de shell, associada a espaços (**)
Em qualquer caso, observe que o número de elementos em uma matriz e o número de palavras (no sentido wc -w
ou da linguagem humana) não são os mesmos, veja abaixo. Use "${#somearray[@]}"
para obter o número de elementos na matriz.
somearray=("foo bar doo" "acdc abba")
echo "${#somearray[@]}" # 2 elements, that contain
echo "${somearray[@]}" | wc -w # 5 whitespace separated words in total
(*) ignorando matrizes esparsas e associativas por enquanto.
(**) assumindo o padrão IFS
.
vmfarm1, maximus
e firefly
não são apenas variáveis, são matrizes.
Use a sintaxe adequada: ${#vmfarm1[@]}
é o número de entradas na sua matriz.
Isso pode não ser inteligente, mas acho que você pode obter o número de hosts na matriz.
vmfarm1=(host1.com host2.com host3.com host4.com)
#maximus=(host11.com host12.com host13.com)
#firefly(host5.com)
COUNT=0
for i in ${vmfarm1[@]};
do
HOSTCOUNT='echo $i |wc -l'
COUNT=$((COUNT + HOSTCOUNT))
done
printf "vmfarm1:%2d\n" $COUNT
Obrigado