Se o texto da função de nome de arquivo igual, em seguida, executar a função

0

Arquivo URLs.txt :

$ cat URLs.txt
www.google.com >/path/to/save

Esse é o meu script:

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
}

Está apenas imprimindo que o nome de host das URLs não inicie a função adequada. Isso deve começar. Outra função depende de URL, como a função google.com start google.com, como alterar isso?

    
por unknown 05.09.2018 / 23:12

2 respostas

1

Não sei por que você tem todos esses loops infinitos de repetição infinitos. Como Andy apontou a sua declaração awk é estranho e provavelmente não vai fazer o que você quer. O script abaixo deve funcionar melhor para seus objetivos.

#!/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 
    
por 06.09.2018 / 00:11
2

Para responder a pergunta no título, como eu entendi: Você quer ler linhas de entrada, e para cada uma que é igual ao nome de uma função de shell, execute essa função.

Você pode usar declare -f func para ver se func está definido, algo assim:

#!/bin/bash

foo() { echo foofoo; }
bar() { echo barbar; }
while read funcname; do
    if declare -f "$funcname" &> /dev/null; then
        "$funcname"
    fi
done

Note que no seu código:

IFS='>' read -r website_url gallery_dir

deixa o espaço antes de > em website_url , pois o IFS que você definiu aqui não contém espaços em branco. Você poderia usar IFS='> ' read ... .

for i in $website_url; do
    echo $i | awk -F '/.' '{print $2}' | xargs
done

Não sei o que isso deve fazer. for i in $website_url divide e globs o valor da variável e tem i loop sobre os valores. O xargs no final do pipeline ecoa o que for recebido como entrada. Nada disso executa nenhuma função. Além disso, o awk separador de campos /. corresponde a uma barra seguida por qualquer caractere, portanto, se a entrada foi, e. foo/bar , a saída resultante seria ar .

    
por 06.09.2018 / 00:22