Bash 等待循环内迭代的完成

Bash wait the completion of an iteration inside loop

我写了一个 bash 脚本,其中有一个 for 循环,在这个 for 循环中,我调用了一个对我的笔记本电脑来说很重的 matlab 脚本。有没有办法等待迭代完成然后开始另一个迭代? 这是我的脚本的一部分:

for f in $FILES
do
  echo "Processing file... $f"
  cp $f $BASEDIR/$RESULTS/$filename/
  echo "generating data for matlab ..."
  ./../../../matlab/graphic_file_gen $f > data_matlab.txt
  if [[ $f == *fsr12* ]]; then
    fullPath=$BASEDIR/$RESULTS/$filename/data_matlab.txt
    cd /home/myname/Desktop/test/
    fsr=12;
    /usr/local/MATLAB/R2015a/bin/matlab -nodisplay -nojvm -nodesktop -r "fullPath='$fullPath'; fsr='$fsr' ; fit_exp_real_data" > $BASEDIR/$RESULTS/$filename/result_matlab.txt</dev/null&
    cd -
  fi  
  cd $BASEDIR/$DECADIMENTI
done

最后的问题是:有没有办法等待这一行的完成?

/usr/local/MATLAB/R2015a/bin/matlab -nodisplay -nojvm -nodesktop -r "fullPath='$fullPath'; fsr='$fsr' ; fit_exp_real_data" > $BASEDIR/$RESULTS/$filename/result_matlab.txt</dev/null&

在开始下一次迭代之前?

是的,只需删除尾部的 & 即可使命令在前台执行。

默认shell命令在前台执行,shell等待它们完成以继续下一行。但是如果在命令末尾添加 &,它会在后台执行,并且 shell 在命令开始后立即继续执行,而不是等待它完成。

根据 Ben Voigt 和 Álvaro Gutiérrez 的见解,我注意到剧本的一部分似乎是多余的。试试这个修改后的版本:

for f in $FILES
do
  echo "Processing file... $f"
  cp $f $BASEDIR/$RESULTS/$filename/
  echo "generating data for matlab ..."
  ./../../../matlab/graphic_file_gen $f > data_matlab.txt
  if [[ $f == *fsr12* ]]; then
    fullPath=$BASEDIR/$RESULTS/$filename/data_matlab.txt
    cd /home/myname/Desktop/test/
    fsr=12;
    /usr/local/MATLAB/R2015a/bin/matlab -nodisplay -nojvm -nodesktop -r "fullPath='$fullPath'; fsr='$fsr' ; fit_exp_real_data" > $BASEDIR/$RESULTS/$filename/result_matlab.txt
    cd -
  fi  
  cd $BASEDIR/$DECADIMENTI
done

如果您在启动 matlab 脚本和继续下一次迭代之间有其他处理要执行,您可以插入 wait 语句暂停,直到 matlab 完成:

/usr/local/MATLAB/R2015a/bin/matlab ... &
# Do more here
wait
cd -

然而,在这里您似乎根本不需要 运行 后台脚本,所以只需省略 &:

/usr/local/MATLAB/R2015a/bin/matlab...
# Script pauses while matlab runs. Once it returns, the script continues
cd -