bers脚本中的&符不起作用

时间:2015-12-27 15:25:19

标签: bash shell curl wget ampersand

使用&符号(&)将其放置在背景中。但是由于某种原因,在这个脚本中它不起作用。我的编程技巧不是很好,所以请记住我是一个努力工作的菜鸟。

#!/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

我想要做的是让脚本等待每个命令,直到前一个命令完成。你可以看到我有时使用'睡眠',但我知道这不是一个解决方案。我还读到了wait命令,但是你必须使用Ampersand在后台放置一个命令。这就是问题所在。由于某种原因,这个脚本在我的curl命令结束时无法识别&符号。我也试过wget,结果相同。谁能指出我正确的方向?

1 个答案:

答案 0 :(得分:0)

首次检查后永远不会改变done。所以你需要检查每次迭代,这就是你应该测试命令而不是变量的原因 while会更好,因为您需要在进入

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

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