我有以下 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
这里我遇到了两个问题:
您还没有引用变量,因此 shell 可能会破坏这些值。我将为您的脚本提供一个替代建议,该建议借鉴了删除空白。
您正在使用正则表达式处理 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
我调试这种情况的方法:
- 哪个 shell 正在执行您的脚本?放在 ”#!“到它工作的外壳(你说它在你的命令行中工作)
- 如果您将脚本更改为直接执行“wget网址“, 在哪里URL 是硬编码的到输出$URL,它会得到文件吗?
- 如果你采取其他一些网址从其他网站,它会工作吗?
- 如果您可以访问该网站,您可以检查一下吗?访问日志和错误日志网络服务器的?
- 什么是退出状态的 wget ?了解什么是“echo $?”会有所帮助。显示,比较http://www.gnu.org/software/wget/manual/wget.html#Exit-Status