整数値のみを持つテキストファイルがあります。つまり、異なる行に異なる整数(たとえば、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の倍数が含まれていない場合は偽の出力が得られます。