次のbashスクリプトがあります。
URL=`grep -E -m 1 -o "<ExportCatalogResult>(.*)</ExportCatalogResult>" costa_export.xml| sed -e 's,.*<ExportCatalogResult>\([^<]*\)</ExportCatalogResult>.*,\1,g'` &&
echo $URL
echo -n $url > url.txt &&
wget $(cat url.txt | tr -d " \t\n\r") -O price.zip
問題は、スクリプトの実行時にwgetが常に空のファイルをダウンロードすることです。
http://training.******.net/WAWS_1_9/Catalog/price.zip //echo $URL
Resolving training.******.net (training.*******.net)... 194.**.***.90, 194.**.***.90
Connecting to training.******.net (training.*****.net)|194.**.***.90|:80... connected.
HTTP request sent, awaiting response... 204 Still exporting
Length: 0
Saving to: ‘price.zip’
[ <=> ] 0 --.-K/s in 0s
ただし、エコーされたURLは有効です(コマンドラインでこのURLを使用してwgetを実行すると、zipパッケージがダウンロードされます)。
なぜこれが起こるのですか?
答え1
ここで2つの問題が発生しました。
変数を引用しなかったため、シェルは値を破損する可能性があります。私はあなたのスクリプトの代替案を提供します。スペースを削除。
正規表現を使用してXMLを処理しています。これは一時的に機能しますが、後で予期しない変更が発生すると中断される可能性が高いことに注意してください。
コードは以下のように表示されます。
#!/bin/bash
# ...
# Not even going to attempt to reduce this without seeing your XML
url=$(grep -E -m 1 -o "<ExportCatalogResult>(.*)</ExportCatalogResult>" costa_export.xml| sed -e 's,.*<ExportCatalogResult>\([^<]*\)</ExportCatalogResult>.*,\1,g')
# Debug
echo "raw: $url" >&2
# Strip leading and trailing whitespace
url="${url#"${url%%[![:space:]]*}"}" # remove leading whitespace
url="${url%"${url##*[![:space:]]}"}" # remove trailing whitespace
# More debug
echo "now: $url" >&2
# Save the URL
echo -n "$url" > url.txt
# Retrieve the URL contents
wget -O price.zip "$url"
答え2
この状況をデバッグする方法は次のとおりです。
- どのシェルがスクリプトを実行していますか?置く」#!「動作するシェルで(コマンドラインで動作すると言ったでしょう)
- 「wget」を直接実行するようにスクリプトを変更した場合URL「、どこURLがハードコードされています。出力$ URLにファイルをインポートしますか?
- とると他のURL他のサイトでは動作しますか?
- もしそのサイトにアクセスできれば確認していただけますか?アクセスログとエラーログWebサーバー?
- 何ですか終了ステータスなぜ? 「echo $?」が何であるかを知ることが役立ちます。表示する、比較するhttp://www.gnu.org/software/wget/manual/wget.html#Exit-Status