bashスクリプトでwgetを実行し、変数にURLを保存するのに問題があります。

bashスクリプトでwgetを実行し、変数にURLを保存するのに問題があります。

次の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つの問題が発生しました。

  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"

おすすめ記事