ファイルのテキスト名が関数と同じ場合は、関数を実行します。

ファイルのテキスト名が関数と同じ場合は、関数を実行します。

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

おすすめ記事