我想知道是否可以在 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"
每当使用 Shell 变量时(包括内部命令替换),都应该用引号引起来。唯一的例外是当您绝对确定您实际上希望变量的值受到 shell 的空白分割的影响时。
$WK_ARTIST
需要通过_
用大括号 ({}
) 括起来来消除歧义,以便 shell 不会将变量名称解释为$WK_ARTIST_
(该变量可能不存在,因此计算结果为空字符串)。这对于 WK_ARTIST 是必需的,但在 WK_ALBUM 的字符串中则不需要,因为
_
是 shell 变量名称中的有效字符(就像 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
是的,您可以使用变量,但是您需要用引号括起来,以便 shell 知道变量名在何处结束:
$ ARTIST=foo
$ ALBUM=bar
$ echo $ARTIST_-_$ALBUM.jpg
-_bar.jpg
因此,shell 正在尝试扩展一个名为 的变量$ARTIST_
,该变量不存在。但是,如果你引用:
$ echo "$ARTIST"_-_"$ALBUM".jpg
foo_-_bar.jpg
所以,尝试:
wget https://en.wikipedia.org/wiki/File:"$ARTIST"_-_"$ALBUM".jpg