web-dev-qa-db-ja.com

bashのforループで入力パラメーターを整数値に変換する方法は?

私のbashスクリプトでは、数値を入力変数として使用しようとしますfor a forループスクリプトを次のように実行します

_./script.sh InputFolder/ Number_of_iterations
_

スクリプトは指定されたフォルダー内で動作し、_Number_of_iterations_変数が設定されている回数だけforループを実行する必要があります。しかし、どういうわけか、変数を整数として設定できません。

これはスクリプトのループの例です。

_for i in {1..$(($2))}
do
 echo "Welcome $i times"
done
_

私はすでに二重括弧$(($...))オプションと二重引用符_"..."_を試しましたが、私が得ている出力は

_Welcome {1..5} times
_

これは整数だと思います。入力パラメーターを整数としてスクリプトに読み込む際の助けに感謝します。

3
Assa Yeroslaviz

これには次の2つの方法があります。

Ksh93互換シェル(ksh93、zsh、bash)の場合:

for (( i=1;i=<$2;i++ ))
do
 echo "Welcome $i times"
done

ここで、iを1に設定してループし、$ 2以下になるまでインクリメントします。

GNUシステム上のPOSIXシェルでは:

for i in $(seq "$2")
do
 echo "Welcome $i times"
done

seqコマンド(GNU固有)は、1から$ 2で指定された数までの数を別々の行に出力します。変更していないと仮定して$IFS(デフォルトでは行区切り文字が含まれます)、コマンド置換は、forがループするのと同じ数の要素に分割します。

5
Raman Sailopal

Bashで使用しようとしているこの構造:{1..$(($2))}または{1..$2}は、中括弧の拡張です。それがあなたのために機能しない理由は、シェル展開の順序でブレース展開が最初のものであるためです。したがって、この拡張が行われるとき、$2$2であり、5ではありません。その場合、ブレース拡張は機能しません。それは単に1..$2を生成し、次に$2を展開するときは、シェルが展開し、次の1つのWordが残ります。

{1..5}

ブレースはブレース拡張によって消費されていないため、ブレースはまだ残っています。

解決策については、 Raman Sailopalの回答 を参照してください。

1
user147505