各行に整数値を持つファイルを読み取り、条件が満たされたらステートメントを実行します。

各行に整数値を持つファイルを読み取り、条件が満たされたらステートメントを実行します。

整数値のみを持つテキストファイルがあります。つまり、異なる行に異なる整数(たとえば、1から47まで)があります。各行を読み取り、別の行の値を取得するスクリプトを作成しました。条件が満たされたら、文をエコーし​​たいと思います。

コンテンツa.txt:(1行に1本のみ、2行目に2本のみ)1 2 3 4 5 ..等47まで。

出力私が望むもの:一度5で表示されます。出力 - 「完了したステップは5です」(二重引用符を除く)。これは5、10、15、20から45まで動作します。

ここにコードがありますが、うまくいかないようです。

 #!/bin/bash

while IFS= read -r line; do
        if [[ $line=="5" ]] ; then
           echo "Step Completed is:" $var
        fi
done < "$1"

また、5つの整数値ごとに同じ文をエコーし​​たいと思います。つまり、スクリプトが 5 を読んだら、エコーする必要があります。完了したステップは5です。 10を読んだら、もう一度エコーする必要があります。完了したステップは10です。このように。

スクリプトを実行するには、次のコマンドを使用します。

. ./al.sh a.txt

ベストアンサー1

シェルスクリプトでこれを行うのではなく、次のことをお勧めしますawk

awk '$1 % 5 == 0 { last_step = $1 } END { printf("Step %s completed\n", last_step ) }' <a.txt

これにより、コードが短く、高速で簡単になります。このawkコードは、入力で見つかった5の倍数をそれぞれ保存し、最後に見つかった最新の数字を印刷します。

テスト(中括弧拡張を含むシェルから):

$ printf '%s\n' {1..47} | awk '$1 % 5 == 0 { last_step = $1 } END { printf("Step %s completed\n", last_step ) }'
Step 45 completed

同等のシェルループは次のとおりです。

while read number; do
    if [ "$(( number % 5 ))" -eq 0 ]; then
        last_step=$number
    fi
done <a.txt

printf 'Step %s completed\n' "$last_step"

出力を実行する前に、有効な値があることを確認するためにテストを挿入できます。last_stepそれ以外の場合、入力に5の倍数が含まれていない場合は偽の出力が得られます。

おすすめ記事