Variable

在 GNU 並行中使用變數作為輸入

  • October 3, 2019

我想在 GNU 並行傳遞參數時使用變數作為輸入。例如,我想使用 GNU 並行執行三個 bash 腳本

“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”。

問題不在於並行,而在於您傳遞的“變數”。這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. 使用普通的 glob
parallel -j0 sh ::: par*sh

也許

parallel -j0 sh ::: par[0-9]*.sh
  1. 預先建構變數
targets=""; for ((num=1;num<=$Filecount;num++)); do targets="$targets par$num.sh"; done
parallel -j0 sh ::: $targets

因此,使用第二種方法,您的腳本將變為(稍微修改以使其與任意文件名安全;與您的情況無關,但可能適用於未來的訪問者):

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"

引用自:https://unix.stackexchange.com/questions/535892