私はBashスクリプトを使用しており、2つの入力番号があります。簡略化のために、最初の変数をStartと呼び、2番目の変数をStopと呼び、各変数は1000から2000の間の数値であると仮定します。
私のファイルは、各数字の最初の2桁に一致する名前でソートされます。たとえば、次のファイル名があります。
/path/to/files11: 1100 から 1199 (含む) の数に対応するファイル
StopとStartが与えられたら、ループを使って次のように正しいファイルを文字列に設定したいと思います。 Start = 1923でStop = 2267の場合は、次のことをしたいと思います(疑似コード)。
MyVariable = "/path/to/files19;/path/to/files20;/path/to/files21;/path/to/files22"
しかし、私は私の範囲内のすべての数値に対してこれを行うことができるようにしたいです。
最初の2桁の数字に基づいて正しい開始ファイルと停止ファイルを選択し、数字を繰り返して正しい文字列を取得する方法についての提案はありますか?
答え1
バッシュを使って
努力する:
Start=1923
Stop=2267
MyVar=
for ((i=Start/100; i<=Stop/100; i++)); do
MyVar="$MyVar;/path/to/files$i"
done
MyVar=${MyVar:1}
echo "$MyVar"
上記のecho
ステートメントは以下を生成します。
/path/to/files19;/path/to/files20;/path/to/files21;/path/to/files22
仕組み:
MyVar=
これにより、変数
MyVar
が空になります。for ((i=Start/100; i<=Stop/100; i++)); do
これで変数のループが始まります
i
。MyVar="$MyVar;/path/to/files$i"
MyVar
ループが実行されるたびに文字列が追加されます。done
これはサイクルの終わりを示します。
MyVar=${MyVar:1}
これにより、文字列の先頭から不要なセミコロンが削除されます。
echo "$MyVar"
これで結果が表示されます。
awkを使う
非常に似たロジックを使用します。
MyVar=$(awk -v Start=1923 -v Stop=2267 'BEGIN{for (i=int(Start/100);i<=int(Stop/100);i++) MyVar=MyVar";/path/to/files" i; print substr(MyVar,2)}')
echo "$MyVar"
上記のecho
ステートメントは以下を生成します。
/path/to/files19;/path/to/files20;/path/to/files21;/path/to/files22
答え2
これは中かっこ拡張操作といくつかの文字列操作評価操作のように見えます。
MyVariable=$(eval "printf '%s' /path/to/files{${Start:0:2}..${Stop:0:2}}\;")
その後、最後のセミコロンを削除したいかもしれません。${MyVariable%;}
上記の例では、your${Start}
と${Stop}
trueが常に少なくとも3桁であるとします。それ以外の場合は、文字列操作を調整する必要があります。