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
答案 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
。如果您的输入文件中包含通配符,空格或其他意外内容,这些行为将远远优于原始习惯用法。