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"
シェル変数(内部コマンド置換を含む)を使用するたびに引用符で囲む必要があります。唯一の例外は、実際には変数の値がシェルの空白の区切りによって影響されることを望むと確信している場合です。
$WK_ARTIST
シェルが変数名を次のように解釈しないように、中_
括弧()で囲んであいまいさを明確にする必要があります(変数が存在しない可能性があるため、空の文字列として評価されます)。{}
$WK_ARTIST_
これはWK_ARTISTには必要ですが、WK_ALBUM文字列には必要ありません。これは
_
、シェル変数名(AZ、az、および最初の文字の後の0〜9文字)に有効な文字があるため.
です。つまり
FOO
、、、、FOO_
およびはすべて有効で完全FOO1
に異なる変数名です。FOO_1
FOOBAR
または、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