Variable
在 GNU 並行中使用變數作為輸入
我想在 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
好消息是這些實際上都不是必需的。您可以執行以下操作之一:
- 使用普通的 glob
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
因此,使用第二種方法,您的腳本將變為(稍微修改以使其與任意文件名安全;與您的情況無關,但可能適用於未來的訪問者):
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"