如果文件中的文本与函数同名,则运行函数

如果文件中的文本与函数同名,则运行函数

文件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 

相关内容