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
,否则它会淹没您的控制台。
使用和号 (&) 将其置于背景中。但由于某种原因,在这个脚本中它不起作用。我的编程技能不是很好,所以请记住我是一个试图让东西工作的菜鸟。
#!/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
,否则它会淹没您的控制台。