使用&符号(&)将其放置在背景中。但是由于某种原因,在这个脚本中它不起作用。我的编程技巧不是很好,所以请记住我是一个努力工作的菜鸟。
#!/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,结果相同。谁能指出我正确的方向?
答案 0 :(得分:0)
首次检查后永远不会改变done
。所以你需要检查每次迭代,这就是你应该测试命令而不是变量的原因
while
会更好,因为您需要在进入
while [ "$(jobs -l | grep curl | wc -l)" -ne 0 ]; do
echo "Still there"
sleep 1
done
我添加了sleep
,因为否则它会淹没你的控制台。