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编写的消息。我不想念你