URL変数を持つwget?

URL変数を持つwget?

wgetが使用するURLに変数を使用できるかどうか疑問に思います。 BASHでこれを再作成しようとしています。現在持っているものは次のとおりです。

WK_ARTIST="$(echo $ARTIST | sed 's/\ /\_/g' )"
WK_ALBUM="$(echo $ALBUM | sed 's/\ /\_/g' )"
echo "$WK_ARTIST"
echo "$WK_ALBUM"

wget https://en.wikipedia.org/wiki/File:"$WK_ARTIST"_-_"$WK_ALBUM".jpg

わかりました。

Warning: wildcards not supported in HTTP.
--2021-06-10 07:24:20--  https://en.wikipedia.org/wiki/File:Lamb_Of_God_-_%1B[1;36mLamb_Of_God.jpg

これは可能ですか?

答え1

WK_ARTIST="$(echo "$ARTIST" | sed 's/ /_/g' )"
WK_ALBUM="$(echo "$ALBUM" | sed 's/ /_/g' )"
echo "$WK_ARTIST"
echo "$WK_ALBUM"

wget "https://en.wikipedia.org/wiki/File:${WK_ARTIST}_-_$WK_ALBUM.jpg"
  1. シェル変数(内部コマンド置換を含む)を使用するたびに引用符で囲む必要があります。唯一の例外は、実際には変数の値がシェルの空白の区切りによって影響されることを望むと確信している場合です。

  2. $WK_ARTISTシェルが変数名を次のように解釈しないように、中_括弧()で囲んであいまいさを明確にする必要があります(変数が存在しない可能性があるため、空の文字列として評価されます)。{}$WK_ARTIST_

    これはWK_ARTISTには必要ですが、WK_ALBUM文字列には必要ありません。これは_、シェル変数名(AZ、az、および最初の文字の後の0〜9文字)に有効な文字があるため.です。

    つまりFOO、、、、FOO_およびはすべて有効で完全FOO1に異なる変数名です。FOO_1FOOBAR

または、bashに組み込まれている検索と置換機能を代わりに使用してくださいecho ... | sed

WK_ARTIST="${WK_ARTIST// /_}"
WK_ALBUM="${WK_ALBUM// /_}"
echo "$WK_ARTIST"
echo "$WK_ALBUM"

wget "https://en.wikipedia.org/wiki/File:${WK_ARTIST}_-_$WK_ALBUM.jpg"

または、URLを複数回使用する場合(またはスクリプトを読みやすくするために)、次のことをお勧めします。

...
URL="https://en.wikipedia.org/wiki/File:${WK_ARTIST}_-_$WK_ALBUM.jpg"
...
wget "$URL"

答え2

はい、変数を使用できますが、変数名が終わる場所をシェルが認識できるように、変数を引用符で囲む必要があります。

$ ARTIST=foo
$ ALBUM=bar
$ echo $ARTIST_-_$ALBUM.jpg
-_bar.jpg

$ARTIST_したがって、シェルは存在しない変数を拡張しようとします。しかし、引用すると次のようになります。

$ echo "$ARTIST"_-_"$ALBUM".jpg
foo_-_bar.jpg

したがって、次のことを試してください。

wget https://en.wikipedia.org/wiki/File:"$ARTIST"_-_"$ALBUM".jpg

関連情報