【问题标题】:Using select statement to repeat process in bash script使用 select 语句在 bash 脚本中重复过程
【发布时间】:2016-01-06 12:57:49
【问题描述】:

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

这是我得到的:

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。

一旦有人输入了一个数字(对应一个 url,需要对其进行排序、保存、存储、冲洗和重复),我不知道如何重复第 3 行到第 7 行的过程。

【问题讨论】:

  • 您可以考虑使用新参数重新执行相同的脚本:exec "$0" "$LINK"
  • for 循环的目的是什么?
  • @Ramana 不,这根本行不通,而你 Don't Read Lines With for

标签: bash loops select sed grep


【解决方案1】:

您的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

【讨论】:

  • @glennjackman 啊,真的。我总是忘记select 自循环。谢谢。
  • 我很欣赏快速响应,以及关于为什么不使用 for 循环来逐行阅读的文章。我会通读一遍。我的问题现在出现在 while 循环开始后的执行中。我收到错误“某些目录不存在”,所以我认为我这样做不正确
  • 但是,我会接受这个答案,因为它是我问题的答案。谢谢! :)
  • output-http://www.google.com/imghp?hl=en&amp;tab=wi.html: No such file or directory cat: output-http://www.google.com/imghp?hl=en&amp;tab=wi.html: No such file or directory 在最初的 ./navigator google.com 之后我按下 1,将第一个链接循环回 while
  • @MikeHenke,那是因为你试图创建一个带有斜杠的文件名——不能这样做。您需要将斜杠转换为 wget 输出文件的另一个字符。
猜你喜欢
  • 1970-01-01
  • 2018-07-19
  • 1970-01-01
  • 1970-01-01
  • 2019-03-08
  • 1970-01-01
  • 1970-01-01
  • 2015-05-31
  • 1970-01-01
相关资源
最近更新 更多