シェル スクリプトBash

シェル スクリプトBash

シェルスクリプトにはこのループがありますが、その機能を完全に理解していないようです。

特に 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 * 48

答え2

このawkビットは、現在の値$k(入力から読み取られるコードの値$1)に4(コマンドラインで設定された変数値)を掛けた値を出力します。awkawks

これは短いでしょう。

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

それほど遠くない。

関連情報