使用select语句在bash脚本中重复进程

时间:2015-10-08 18:48:07

标签: bash loops select sed grep

我非常接近完成我的任务,但我有点难过一部分。

这是我得到的:

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文件,然后使用grep和sed对该html文件进行排序,只取出“http:// ...”,然后将其放入文件中它存储在一个名为bcache的目录中。

select语句打印出所有带有前面数字的“http:// ...”,最后一个选项是q_to_quit。

一旦有人输入一个数字(相当于一个需要分类,保存,存储,冲洗和重复的网址),我无法弄清楚如何重复第3到第7行的过程。

1 个答案:

答案 0 :(得分:2)

您的for循环只会循环一次(理想情况下),因为$1应该只是一个单词(并且应该引用"$1"),以确保无论您给出的是什么值使用正确)。

所以你可能不需要它。

如果您尝试将支持多个参数传递给脚本,那么您需要for file in "$@"(或只是for file这是相同的事情)但这并不是很有效其余的脚本操作在我看来。

鉴于上述要获得效果,您实际上希望将循环体放在while truewhile :循环中,并在这些顶行而不是$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发表评论,你不应该Read Lines With for