GNU並列の方法で引数を渡しながら、変数を入力として使用したいと思います。たとえば、3つのbashスクリプトがあり、GNU Parallelを使用して並列に実行したいとします。
「par1.sh」、「par2.sh」、「par3.sh」。私のスクリプトは次のとおりです
Filecount=$(grep -c "if" $1)
echo $Filecount
parallel -j0 sh ::: par$(seq 1 $Filecount).sh
mkdir $2
mv par$(seq 1 $Filecount).sh ./$2
私はこのコードを実行するために可能なすべてを試しましたが、うまくいきません。だから私の質問は、GNU並列処理に変数を提供する方法です。私もこれを試しました:
par{1..$Filecount}.sh
しかし、それも動作しません。 「seq」も試しました。
ベストアンサー1
問題は並列性ではなく、渡す「変数」にあります。これはpar$(seq 1 $Filecount).sh
(仮説的に)次のように拡張されますFilecount=10
。
$ echo par$(seq 1 $Filecount).sh
par1 2 3 4 5 6 7 8 9 10.sh
中かっこ拡張のように機能したいです。
$ echo par{1..10}.sh
par1.sh par2.sh par3.sh par4.sh par5.sh par6.sh par7.sh par8.sh par9.sh par10.sh
ただし、変数は中括弧拡張内では拡張されません。
$ echo par{1..$Filecount}.sh
par{1..10}.sh
良いニュースは、どちらも実際には必要ないということです。次のいずれかを実行できます。
一般グローブの使用
parallel -j0 sh ::: par*sh
おそらく
parallel -j0 sh ::: par[0-9]*.sh
プリビルド変数
targets=""; for ((num=1;num<=$Filecount;num++)); do targets="$targets par$num.sh"; done parallel -j0 sh ::: $targets
したがって、2番目のアプローチでは、スクリプトは次のようになります(任意のファイル名に対して安全になるように少し変更されており、お客様の場合は関係ありませんが、今後の訪問者には適している可能性があります)。
Filecount=$(grep -c "if" "$1")
echo "$Filecount"
targets=( "par1.sh" );
for ((num=2;num<=$Filecount;num++)); do
targets=("${targets[@]}" par"$num".sh);
done
parallel -j0 sh ::: "${targets[@]}"
mkdir "$2"
mv "${targets[@]}" ./"$2"