bash 脚本中的 & 符不起作用

Ampersand in bash script not working

使用和号 (&) 将其置于背景中。但由于某种原因,在这个脚本中它不起作用。我的编程技能不是很好,所以请记住我是一个试图让东西工作的菜鸟。

#!/bin/bash

# Date in format used by filenaming 
date=$(date '+%Y%m%d')

# Location where the patch files should be downloaded
patches=~/lists/patches

# Location of the full list
blacklist=~/lists/list

    while :
                    do
                            # Fetching last download date from downloaded patches
                            ldd=$(cd $patches  && printf '%s\n' * | sed "s/[^0-9]*//g"); echo $ldd
                                    if [ "$ldd" = "" ]
                                    then
                                            break
                                    else
                                            if [ "$ldd" = "$date" ]

                                                    then
                                                            break
                                                    else
                                                            ndd=$(date +%Y%m%d -d "${ldd}+1 days")

                                                            # Cant have multiple patches in $patches directory, otherwise script wont work
                                                            rm -rf $patches/*
                                                            sleep 1
                                                            file=$patches/changes-$ndd.diff.gz
                                                             curl -s -o "$file" "http://url.com/directory/name-$ndd.diff.gz" &
                                                            sleep 1

                                                            done=$(jobs -l | grep curl | wc -l)

                                                                 until [ "$done" == 1 ]
                                                                 do
                                                                    echo "still here"
                                                                 done

                                                            gunzip "$file"

                                                            # Apply patch directory to list's file directories
                                                            cat $(echo "$file" | sed "s/.gz//g") | sed 's/.\/yesterday//' | sed 's/.\/today//' > $patches/$ndd.diff
                                                            rm $(echo $file | sed "s/.gz//g")
                                                            cd $blacklist
                                                            patch -p1 --batch -r /root/fail.patch < $patches/$ndd.diff
                                                            rm /root/fail.patch
                                            fi
                                    fi
                    done

我想要做的是让脚本等待每个命令,直到前一个命令完成。如您所见,我有时使用 'sleep' 但我知道这不是解决方案。我还阅读了有关 wait 命令的信息,但是您必须使用 A 符号在后台放置一个命令。这就是问题所在。由于某种原因,此脚本无法识别我的 curl 命令末尾的 & 符号。我也试过 wget,同样的结果。谁能给我指出正确的方向?

第一次检查后它永远不会改变 done。所以你需要检查每次迭代,这就是为什么你应该测试命令,而不是变量 而while会更好,因为在输入

之前需要检查
 while [ "$(jobs -l | grep curl | wc -l)" -ne 0 ]; do
   echo "Still there"
   sleep 1
 done

我添加了 sleep,否则它会淹没您的控制台。