整数値のみを持つテキストファイルがあります。つまり、異なる行に異なる整数(たとえば、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の倍数が含まれていない場合は偽の出力が得られます。
答え2
5行目に「ステップ完了」を出力するには、残りのステップ番号を5で割って0と比較します。
#!/bin/bash
while IFS= read -r line;
do
if [[ $(( line %5 )) -eq 0 ]] ; then
echo "Step Completed is: $line"
fi
done < "$1"
line
(変数が呼び出されるスクリプトにもありませんvar
。)
最後の行だけが必要な場合は、最後まで印刷するのを待つ必要があります。完全な数値シーケンスがある場合は、最後にそれを計算できます。
#!/bin/bash
while IFS= read -r line;
do
# do whatever for the line
echo $line >/dev/null
done < "$1"
echo "Step completed is: $(( 5 * ( line % 5 ) ))"
それ以外の場合は、最後に見たことを覚えておいてください。
#!/bin/bash
while IFS= read -r line;
do
[[ $(( line %5 )) -eq 0 ]] && line5=$line
# do whatever for the line
done < "$1"
[[ ! -z "$line5" ]] && echo "Step completed is: $line5"