私はこの質問を見たことがありますシェルを使用して文字列の単語数を計算する方法SOでは、変数内の単語数を計算する方法について説明します。
しかし、これは私の変数から1つの単語しか計算しないので、修正方法がわかりません。
次の変数があります。
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 "$#"
今度は、配列変数のすべての要素でスペースで区切られた単語数にを使用したいと思いますが、少なくとも1つのスペースで区切られたすべての要素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
ありがとう