文件URLs.txt
:
$ cat URLs.txt
www.google.com >/path/to/save
这是我的脚本:
dl_url() {
while true; do
while IFS='>' read -r website_url gallery_dir; do
echo "Downloading $website_url"
echo "To $gallery_dir"
sleep 1
mkdir -p ./update_photo_temp/
wget --quiet $website_url -P ./update_photo_temp/
## If $website_url = to function then run function
for i in $website_url; do
echo $i | awk -F '/.' '{print $2}' | xargs
done
done < ./URLs.txt
done
}
google.com() {
while true; do
echo "blah blah blah"
done
}
它只是打印 URL 主机名而不启动正确的功能,这应该启动另一个取决于 URL 的功能,例如 google.com 启动 google.com 功能,如何更改?
答案1
要回答标题中的问题,按照我的理解:您想要读取输入行,并且对于每个等于 shell 函数名称的行,运行该函数。
您可以使用declare -f func
来查看是否func
已定义,如下所示:
#!/bin/bash
foo() { echo foofoo; }
bar() { echo barbar; }
while read funcname; do
if declare -f "$funcname" &> /dev/null; then
"$funcname"
fi
done
请注意,在您的代码中:
IFS='>' read -r website_url gallery_dir
>
留下in之前的空格website_url
,因为IFS
您在此处设置的不包含任何空格。你可以用IFS='> ' read ...
它来代替。
for i in $website_url; do
echo $i | awk -F '/.' '{print $2}' | xargs
done
我不确定这应该做什么。for i in $website_url
拆分并全局化变量的值,并对i
这些值进行循环。xargs
管道末端的 会回显它作为输入获得的任何内容。这些都没有运行任何功能。此外,awk
字段分隔符/.
与斜杠后跟任何字符匹配,因此如果输入是 eg foo/bar
,则结果输出将为ar
。
答案2
不知道为什么你有那些无限重复的 while 循环。正如安迪指出的那样,您的 awk 语句很奇怪,并且可能不会执行您想要的操作。下面的脚本应该更适合您的目的。
#!/bin/bash
cleanup(){
if [[ ${1} == "www.google.com" ]]; then
echo "blah blah blah"
else
echo "url not found"
fi
}
while IFS='>' read -r website_url gallery_dir; do
echo "Downloading $website_url"
echo "To $gallery_dir"; sleep 1
mkdir -p ./update_photo_temp/
wget --quiet $website_url -P ./update_photo_temp/
for i in $website_url; do
cleanup ${i}
done
done < ./URLs.txt