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