bash for ループの最後の反復決定

bash for ループの最後の反復決定

設定ファイルにいくつかの行を追加するループがあります。

for i in ${H//,/ }
do
        sed -i "7i\                      host($i) or" $configPath/$g.conf
done

$ Hはコンマ区切りの変数です(例:host1、host2、host4、host10)。

次を返します。

                  host(host10) or
                  host(host4) or
                  host(host2) or
                  host(host1) or

しかし、私が達成したいのは次のとおりです。

                  host(host10) or
                  host(host4) or
                  host(host2) or
                  host(host1)

またはその逆も:

                  host(host1) or
                  host(host2) or
                  host(host4) or
                  host(host10)

私がこれを行う方法の正しい方向を見つけるのを助けることができる人はいますか?

ベストアンサー1

この問題は、ほとんどのプログラミング言語で同じ形式で発生します。何とかサフィックスをスキップするのは複雑です。私はシェル構文について議論しません。人々が一般的にこの問題にどのようにアクセスするかについての疑似コードの概要だけを説明します。

# get it over with at the beginning:
print a[0] (no newline)
loop from a[1] onwards:
   print "or\n"
   print a[i]
print "\n" #terminate the last one

この場合、インデックステストは含まれていないため(言語がbashやPythonなどの配列の直接反復をサポートしている場合)、インデックスを繰り返すか、すべての要素を繰り返し(最初の要素をスキップするように)動作します。できます。

0から始めて最後の項目をスキップしてループの外で処理することもできます(上のミラーを参照)、最後の項目をスキップすることは通常汚れて不可能です(最後の項目をスキップするには最後の項目であることに注意してください。)はいつでもすぐにスキップできます。ストリームから要素を読み込み、どの要素が最後の要素であるかが事前にわからない場合、この形式は唯一のオプションです。

別の方法:

# test a loop counter
N = length of array
loop with indices:
   if i==N-1:
      print a[i]
   else:
      print a[i],"or"

この場合、要素の数を知る必要があり、インデックスを継続的にテストします。したがって、インデックスを繰り返すか、インデックスを個別に追跡する必要があります(ループの前にi = 0を設定し、ループ内にi ++を設定)。

私はこれをレシピで書いており、bashの実装はあなたに任せます。

おすすめ記事