一段时间的读取循环如何在bash中工作?

时间:2016-10-27 17:14:15

标签: bash web-crawler

This is a crawler from GitHub我要自己实施,但由于我是新手,因此无法阅读bash。这可以在答案中解释

#!/bin/bash

# Create an array files that contains list of filenames
files=($(< url.txt))
cities=($(< city.txt))
url="http://www.grotal.com/"
citycodes=($(<citycode.txt))

# Read through the url.txt file and execute wget command for every filename
while IFS='=| ' read -r param uri; do
    for file in "${files[@]}"; do
        for city in "${cities[@]}"; do
            mkdir "${city}"
            mkdir "${city}/${file}"
            wget -O "${city}/${file}/${file}${citycodes[@]}" "${uri}${url}${city}/${file}-${citycodes[@]}/"
        done
    done
done < url.txt

特别是这些(即使你选择downvote ......)

while IFS='=| ' read -r param uri;

然后这个:

done < url.txt

1 个答案:

答案 0 :(得分:2)

让我们把它分解成碎片:

  • read,除非给出一个非默认的-d参数来指定一个终结符来代替换行符,否则从stdin中读取一行(即读取到下一个换行符) ;在IFS字符上拆分该行,并将每个字段写入不同的变量。如果它在到达换行符之前无法读取更多数据,则它会发出非零退出状态,即使它成功填充了给定的变量。 (-r参数阻止read将反斜杠视为连续字符而不是文字;除非您有特定的理由在手头的上下文中提供连续字符,否则应该养成传递{{ 1}}默认情况下为-r
  • read< url.txt上的读取句柄重定向到stdin,以获取该命令所附带的命令(包括url.txt循环的复合命令)。
  • while循环运行它给出的条件命令,检查该条件是否报告成功或失败,然后继续运行正文并在成功时重新启动,或者在失败时退出。

因此,如果你有while,它将从stdin读取一行;将第一个IFS='=| ' read -r param uri=或空格的所有内容分配给名为|的变量,并将剩下的内容分配给变量param

如果你把它放在uri循环的条件部分,那么循环将一直运行直到while失败 - 如果没有更多的内容(直到并且包括可以阅读的换行符。

有关习语及其用法的更深入讨论,请参阅BashFAQ #1

一些旁白:

  • 使用read将只允许一个mkdir -p -- "${city}/${file}"命令创建两个目录(如果已存在则避免生成错误消息)。
  • 使用mkdir是一种更健壮的方式,可以将readarray -t files < url.txt的内容读入名为url.txt的数组中,但它需要bash 4.0或更高版本。对于旧版本的shell,请考虑files。如果您的输入文件中包含通配符,空格或其他意外内容,这些行为将远远优于原始习惯用法。