我非常接近完成我的任务,但我对其中一个部分有点困惑。
我得到的是:
for file in $1
do
wget "$1" -O "output-$1.html" -q
cat output-$1.html | grep -o '<a .*href=.*>' |
sed -e 's/<a /\n<a /g' |
sed -e 's/<a .*href=['"'"'"]//' -e 's/["'"'"'].*$//' -e '/^$/ d' |
grep 'http' > ~/bcache/$1.bcache
select LINK in `cat ~/bcache/$1.bcache` "q_to_quit"
do
if [ $LINK = "q_to_quit" ]
then
exit 1
else
repeat lines 3-7
fi
done
第3-7行获取一个url并将其输出到html文件,然后将该html文件与grep进行排序,sed只取出"http://..."“,然后将该文件放入一个存储在一个名为bcache的目录中。
select语句打印出所有"http://...“,其前面都有数字,最后一个选项是q_to_quit。
当某人输入一个数字时,我想不出如何重复第3行到第7行的过程(这个数字对应于一个url,它需要排序、保存和存储、漂洗和重复)。
发布于 2015-10-08 18:57:50
您的for
循环只循环一次(理想情况下),因为$1
只应该是一个单词(并且应该引用"$1"
,以确保正确地使用给定的值)。
所以你可能不需要它。
如果您试图将支持多个参数传递给脚本,那么您需要for file in "$@"
(或者仅仅是for file
,这是一回事),但是这并不能很好地适用于脚本操作的其余部分,在我看来是这样的。
鉴于以上所述,为了获得实际效果,您需要将循环体放在一个while true
或while :
循环中,并在这些顶层行中使用$LINK
而不是$1
。
LINK=$1
while :; do
wget "$LINK" -O "output-$LINK.html" -q
cat "output-$LINK.html" | grep -o '<a .*href=.*>' |
sed -e 's/<a /\n<a /g' |
sed -e 's/<a .*href=['"'"'"]//' -e 's/["'"'"'].*$//' -e '/^$/ d' |
grep 'http' > ~/bcache/"$LINK.bcache"
select LINK in `cat ~/bcache/"$LINK.bcache"` "q_to_quit"
do
if [ $LINK = "q_to_quit" ]
then
exit 1
else
break
fi
done
done
另外,正如我刚才在OP上发表的评论一样,您不应该使用for
。
https://stackoverflow.com/questions/33023659
复制相似问题