web-dev-qa-db-ja.com

bashでwget --header =を設定しても機能しない

Wgetでヘッダーを設定しようとしています。端末で次のコマンドを実行すると動作しますwget -d --header="User-Agent: Mozilla/5.0 (Windows NT 6.0) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11"' http://website.com -O index

しかし、同じものを変数に入れてbashスクリプトを実行しようとすると、機能しません。

私が試したこと

header='-d --header="User-Agent: Mozilla/5.0 (Windows NT 6.0) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11"'
wget "$header" http://google.com -O index

エラー

wget: invalid option -- ' '
wget: invalid option -- '-'
wget: invalid option -- '-'
Usage: wget [OPTION]... [URL]...
12
rabotalius

変数を使用する場合は、二重引用符を使用する必要があります。それ以外の場合は、複数の単語に展開されます。一方、変数値を2回引用する必要はありません。以下はうまくいくはずです:

header='--header=User-Agent: Mozilla/5.0 (Windows NT 6.0) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11'
wget "$header" http://website.com -O index

編集:複数の引数に変数を使用する場合は、配列を使用します。

args=(-d '--header=User-Agent: Mozilla/5.0 (Windows NT 6.0) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11')
wget "${args[@]}" http://website.com -O index
16
nosid

あなたがする必要があるのは、次のように_-d_をエスケープすることです:header='\-d --header="User-Agent: Mozilla/5.0 (Windows NT 6.0) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11"'

1
Michael Meepo

これの代わりに

wget $header http://website.com -O index

これを試して、

wget "$header" http://website.com -O index

ヘッダー変数に割り当てるときに、ヘッダーテキストのスペースが分割されます。この問題を回避するには、変数を引用符 ""で囲む必要があります。

コメントの後:これを試してください-

someheader="-d --header='User-Agent: Mozilla/5.0 (Windows NT 6.0) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11'"
wget "$someheader" http://website.com -O index

名前ヘッダーが--headerと競合しているようです。または、引用符である場合もあります。コピーして入力する代わりに、再試行してください。それでも、変!

1

コメント:bash配列に関する 'nosid'のトリックがうまくいきました。私の場合、関連するコードは次のとおりです。

WGET_OPTS="-r -N -nd -np -nH --timeout=120 --tries=3"
WGET_OPTS_ARRAY=(${WGET_OPTS// / })
wget "${WGET_OPTS_ARRAY[@]}" -A "$FILE_PAT" -P "$TO_DIR" "$FROM_URL"
1
WxWizard