쉘 배열 변수의 요소/단어 수

쉘 배열 변수의 요소/단어 수

나는 이 질문을 본 적이 있다쉘을 사용하여 문자열의 단어 수를 계산하는 방법SO에서는 변수 내의 단어 수를 계산하는 방법을 설명합니다.

하지만 이것은 내 변수에서 한 단어만 계산하므로 수정 방법을 모르겠습니다.

다음과 같은 변수가 있습니다.

vmfarm1=(host1.com host2.com host3.com host4.com )
maximus=(host11.com host 12.com host 13.com)
firefly=(host5.com)

모든 호스트 이름을 변수 내의 숫자에 포함시키는 방법을 찾아야 합니다.

이후에는 계산된 내부 숫자를 해당 행의 변수로 사용해야 합니다.

나는 시도했다:

echo "$input" | wc -w
printf ' \n|/4.vmfarm1 ' >>  textfile.txt

4위의 내용을 직접 숫자에 적어야하고 자동으로 수행되도록 해야 하므로 변수가 필요합니다 .

답변1

배열을 지원하는 다양한 쉘에서 배열 변수의 요소 수를 인쇄하려면 다음을 수행하십시오.

  • csh///// :tcshzshrcesakangaecho $#array
  • ksh1/ bash1/ zsh:echo "${#array[@]}"
  • fish:count $array
  • yash:echo "${array[#]}"
  • Bourne/POSIX 쉘(유일한 배열은 "$@"):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

또는 요소를 공백으로 구분된 추가 단어로 분할하고 셸 자체에서 개수를 계산할 수 있습니다.

  • csh/ tcsh(SPC/TAB/NL로 분할)

    (set noglob; set tmp=($array); echo $#tmp)
    
  • ksh// bash( yash분할 $IFS, 기본값은 SPC/TAB/NL입니다)

    (set -o noglob; set -- ${array[@]}; echo "$#")
    
  • zsh( $IFS분할, 기본값은 SPC/TAB/NL/NUL입니다)

    echo ${#${=array}}
    
  • rc/ es( $ifs나뉘다):

    tmp = `{echo $array}
    echo $#tmp
    
  • fish(PCRE에 따라 공백이 아닌 모든 문자 시퀀스 계산):

    count (string match -ar -- '\S+' $array)
    
  • Bourne/POSIX( $IFS분할):

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

ksh1 / 배열이 희박하고 다른 모든 쉘에서 인덱싱이 1에서 시작하는 것이 아니라 0에서 시작한다는 점을 고려하면 bash이 숫자는 일반적으로 배열의 최대 인덱스와 동일하지 않습니다.

답변2

배열이 주어지면 arr길이(요소 수)는 로 지정됩니다 ${#arr[@]}.

이것을 vmfarm1배열과 함께 사용하십시오.

printf ' \n|/%d.vmfarm1 ' "${#vmfarm1[@]}" >>textfile.txt

답변3

vmfarm1, maximus그리고 firefly그것은 단순한 변수가 아니라 배열입니다.

올바른 구문 사용: ${#vmfarm1[@]}은 배열의 항목 수입니다.

답변4

이것은 현명하지 않을 수도 있지만 배열의 호스트 수를 얻을 수 있다고 생각합니다.

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

감사해요

관련 정보