私の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
_
これは整数だと思います。入力パラメーターを整数としてスクリプトに読み込む際の助けに感謝します。
これには次の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
がループするのと同じ数の要素に分割します。
Bashで使用しようとしているこの構造:{1..$(($2))}
または{1..$2}
は、中括弧の拡張です。それがあなたのために機能しない理由は、シェル展開の順序でブレース展開が最初のものであるためです。したがって、この拡張が行われるとき、$2
は$2
であり、5
ではありません。その場合、ブレース拡張は機能しません。それは単に1..$2
を生成し、次に$2
を展開するときは、シェルが展開し、次の1つのWordが残ります。
{1..5}
ブレースはブレース拡張によって消費されていないため、ブレースはまだ残っています。
解決策については、 Raman Sailopalの回答 を参照してください。