シェル配列変数の要素/単語数

シェル配列変数の要素/単語数

私はこの質問を見たことがありますシェルを使用して文字列の単語数を計算する方法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/////:tcshzshrcesakangaecho $#array
  • ksh1/ bash1/ 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// bashyash分割$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

ありがとう

関連情報