bash脚本中的符号与无效

bash脚本中的符号与无效,bash,shell,curl,wget,ampersand,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

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

#!/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
#/bin/bash
#文件命名使用的格式的日期
日期=$(日期'+%Y%m%d')
#应下载修补程序文件的位置
补丁=~/列表/补丁
#完整列表的位置
黑名单=~/lists/list
而:
做
#从下载的修补程序获取上次下载日期
ldd=$(cd$patches&printf“%s\n”*| sed“s/[^0-9]*//g”);echo$ldd
如果[“$ldd”=”]
然后
打破
其他的
如果[“$ldd”=“$date”]
然后
打破
其他的
ndd=$(日期+%Y%m%d-d“${ldd}+1天”)
#在$patches目录中不能有多个补丁,否则脚本将无法工作
rm-rf$补丁/*
睡眠1
文件=$patches/changes-$ndd.diff.gz
curl-s-o“$file”http://url.com/directory/name-$ndd.diff.gz“&
睡眠1
完成=$(作业-l | grep curl | wc-l)
直到[“$done”==1]
做
回声“还在这里”
完成
gunzip“$file”
#将修补程序目录应用于列表的文件目录
cat$(echo“$file”| sed“s/.gz//g”)| sed“s/\/昨天/'| sed“s/\/今天/'>$patches/$ndd.diff
rm$(echo$文件| sed“s/.gz//g”)
cd$黑名单
修补程序-p1--批处理-r/root/fail.patch<$patches/$ndd.diff
rm/root/fail.patch
fi
fi
完成

我想做的是让脚本等待每个命令,直到前一个命令完成。正如你所看到的,我有时使用“睡眠”,但我知道这不是一个解决办法。我也读过wait命令,但是你必须在后台使用符号和放置一个命令。这就是问题所在。出于某种原因,此脚本无法识别curl命令末尾的符号。我也尝试了wget,同样的结果。谁能给我指出正确的方向?

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

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

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

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

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

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

为什么要在下一步中等待它完成时将
curl
发送到后台?简单地说,删除
&
和下面的作业检查,您就没事了……您的意思是,如果我不使用
&
作业,我仍然可以使用
作业看到它?不,我的意思是-您根本不需要使用
作业
,因为在这种情况下,没有任何理由将curl发送到后台。为什么要在下一步等待它完成时将
curl
发送到后台?简单地说,删除
&
和下面的作业检查,您就没事了……您的意思是,如果我不使用
&
作业,我仍然可以使用
作业看到它?不,我的意思是-您根本不需要使用
作业
,因为在本例中,没有任何理由将curl发送到后台。@jm666看起来想知道一切都正常,
wait
只会等待,不会说它“还在那里”。对于我来说,用
-s
开关将
curl
发送到BG中,并在每秒向终端发送“仍然在这里”消息后立即发送,而不是使用更干净的
curl
而不使用
-s
(例如,使用progressbar),没有将其发送到BG,也没有任何无用的
,而。。。工作。。。grep…sleep
构造。对我来说,更简单、更干净、更有效。也许他以后会添加更多的
curl
。我不知道。。。他问——我已经回答了。这很容易解释为什么我希望它保持沉默。我一直在写这个剧本,现在我不断尝试学习新的东西,然后改进我的剧本。最后,我希望能够运行脚本,只看到我使用echo编写的消息。我不想念你