シェルスクリプトにはこのループがありますが、その機能を完全に理解していないようです。
特に gawk -v
for ((k=$1; $k<3 + 3 ; k=$k + $3))
do
echo $k | gawk -v s=4 '{print $1*s}'
done
パラメータが2 10 4であるとします。
答え1
私はこれが宿題の問題だと想像できます。
それを分析しましょう。まず、開始$1
、増加$3
、停止するループがあります6
。したがって、渡すと、2 10 4
ループは最初から始まり2
増加します4
。のですぐに停止します2 + 4 = 6
。
したがって、以下は2
引数に従ってください2 10 4
。
for ((k=$1; $k<3 + 3 ; k=$k + $3))
do
echo $k
done
ループを通過するたびに出力を処理しますgawk -v s=4 '{print $1*s}'
。これは非常に小さな「awk」プログラムです。変数を設定しますs=4
。次に印刷します(例$1*s
:。2 * 4
8
答え2
このawk
ビットは、現在の値$k
(入力から読み取られるコードの値$1
)に4(コマンドラインで設定された変数値)を掛けた値を出力します。awk
awk
s
これは短いでしょう。
printf '%d\n' "$(( 4*k ))"
最初のパラメータから3番目のパラメータまで、手順5を繰り返します。 2番目の主張は何の違いもありません。
したがって、すべてを次のように単純化できます。
seq "$(( 4*$1 ))" "$(( 4*$3 ))" 20
GNUの3つのパラメータseq
はスタート、増加と終わり「これは出力、出力は常にループ変数の現在値の4倍です。ループはから始まるので、$1
出力はその値の4倍で始まります。周期が増える$3
ので4倍になります。ループは$k
最大5(1 less 3+3
)で終わるため、出力はendです4*5
。
またはループseq
で呼び出す場合:bash
for (( k = 4*$1; k <= 20; k += 4*$3 )); do
printf '%d\n' "$k"
done
そしてご覧のように、
for (( k = $1; k <= 5; k += $3 )); do
printf '%d\n' "$(( 4*k ))"
done
それほど遠くない。