나는 이 질문을 본 적이 있다쉘을 사용하여 문자열의 단어 수를 계산하는 방법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
///// :tcsh
zsh
rc
es
akanga
echo $#array
ksh
1/bash
1/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 "$#")
ksh
1 / 배열이 희박하고 다른 모든 쉘에서 인덱싱이 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
감사해요