파일의 텍스트 이름이 함수와 동일한 경우 함수를 실행합니다.

파일의 텍스트 이름이 함수와 동일한 경우 함수를 실행합니다.

문서 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
}

google.com이 google.com 기능을 시작하는 것처럼 URL에 의존하는 다른 기능을 시작해야 하는 올바른 기능을 시작하지 않고 URL 호스트 이름만 인쇄합니다. 어떻게 변경합니까?

답변1

내가 이해하는 대로 제목의 질문에 대답하려면 입력 행을 읽고 쉘 함수 이름과 동일한 각 행에 대해 함수를 실행하십시오.

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

>여기에서 설정한 내용 website_url에는 공백이 포함되어 있지 않으므로 in 앞에 공백을 남겨두십시오 . 대신 이것을 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필드 구분 기호는 /.슬래시 뒤에 임의의 문자가 오는 것과 일치하므로 입력이 예를 들어 이면 foo/bar결과 출력은 가 됩니다 ar.

답변2

왜 무한 반복되는 while 루프가 있는지 잘 모르겠습니다. Andy가 지적했듯이, 귀하의 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 

관련 정보