GNU並列処理で変数を入力として使用する

GNU並列処理で変数を入力として使用する

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

良いニュースは、どちらも実際には必要ないということです。次のいずれかを実行できます。

  1. 一般グローブの使用

    parallel -j0 sh ::: par*sh
    

    おそらく

    parallel -j0 sh ::: par[0-9]*.sh
    
  2. プリビルド変数

    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"

おすすめ記事