Количество элементов / слов в переменной массива оболочки

Я не обновлял свой сервер Arch в течение нескольких недель: ncurses действительно перешел на версию 6 в начале сентября, но PHP следовало обновить вместе с ней.

Быстрое и грязное исправление: pacman -U /var/cache/pacman/pkg/ncurses-5.9-7-i686.pkg.tar.xz

Вы можете установить PHP через Пакман . Есть ряд частей, которые я считаю необходимыми, включая php , php-apache , php-gd , php-sqlite . Если вы компилируете PHP из исходных кодов, чтобы оставаться на определенной версии, я не уверен, что это хорошая идея, поскольку PHP часто исправляется. Было бы сложно не отставать от патчей безопасности, компилируя все самостоятельно.

4
15.05.2018, 15:21
5 ответов

Dada una matriz arr, su longitud (número de elementos )está dada por ${#arr[@]}.

Usando esto con su matriz vmfarm1:

printf ' \n|/%d.vmfarm1 ' "${#vmfarm1[@]}" >>textfile.txt
11
27.01.2020, 20:44

vmfarm1, maximusy fireflyno son solo variables, son matrices.

Use la sintaxis adecuada:${#vmfarm1[@]}es el número de entradas en su matriz.

3
27.01.2020, 20:44

Para imprimir el número de elementos en una variable de matriz en varios shells con soporte de matriz:

  • csh/ tcsh/ zsh/ rc/ es/akanga:echo $#array
  • ksh¹/ bash¹/zsh:echo "${#array[@]}"
  • fish:count $array
  • yash:echo "${array[#]}"
  • Shells Bourne/POSIX (donde la única matriz es"$@"):echo "$#"

Ahora, para la cantidad de palabras delimitadas por espacios en blanco en todos los elementos de una variable de matriz, es posible que desee usar wc -w, pero debe ingresar el contenido de todos los elementos separados por al menos uno espacio en blanco por ejemplo con:

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

O puede dividir los elementos en más espacios en blanco -palabras delimitadas y contarlas en el propio caparazón.

  • csh/tcsh(dividido en SPC/TAB/NL)

    (set noglob; set tmp=($array); echo $#tmp)
    
  • ksh/ bash/yash($IFSdivisión, SPC/TAB/NL por defecto)

    (set -o noglob; set -- ${array[@]}; echo "$#")
    
  • zsh($IFSdivisión, SPC/TAB/NL/NUL por defecto)

    echo ${#${=array}}
    
  • rc/es($ifsdivisión):

    tmp = `{echo $array}
    echo $#tmp
    
  • fish(cuenta todas las secuencias de espacios en blanco (que no son -según PCRE )caracteres):

    count (string match -ar -- '\S+' $array)
    
  • Bourne/POSIX($IFSdivisión):

    (set -f; set -- $@; echo "$#")
    

¹ tenga en cuenta que, dado que las matrices ksh/ bashson ​​escasas y tienen índices que comienzan en 0 en lugar de 1 en cualquier otra capa, ese número generalmente no será el mismo que el índice máximo en la matriz

11
27.01.2020, 20:44

En Bash y ksh, al expandir una matriz como si fuera una variable de cadena normal, se obtiene el primer elemento de la matriz. Es decir, $somearrayes lo mismo que ${somearray[0]}.(*)

Entonces,

somearray=(foo bar doo)
echo "$somearray"
echo "$somearray" | wc -w

imprime fooy 1, ya que fooes solo una palabra. Si tuviera somearray=("foo bar doo" "acdc abba")en su lugar, entonces wcmostraría tres palabras.

Deberá usar "${somearray[@]}"para expandir todos los elementos de la matriz como palabras de shell distintas (argumentos ),o "${somearray[*]}"para expandirlas como una sola palabra shell, unidas con espacios(**)

En cualquier caso, tenga en cuenta que el número de elementos en una matriz y el número de palabras (en el wc -wo el sentido del lenguaje humano )no son lo mismo, consulte a continuación. Use "${#somearray[@]}"para obtener el número de elementos en la matriz.

somearray=("foo bar doo" "acdc abba")
echo "${#somearray[@]}"                # 2 elements, that contain
echo "${somearray[@]}" | wc -w         # 5 whitespace separated words in total

(*)ignorando matrices dispersas y asociativas por ahora.

(**)asumiendo por defectoIFS.

3
27.01.2020, 20:44

Puede que esto no sea inteligente, pero creo que puede obtener una cantidad de hosts en la 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

Gracias

0
27.01.2020, 20:44

Теги

Похожие вопросы