在 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

这里我遇到了两个问题:

  1. 您还没有引用变量,因此 shell 可能会破坏这些值。我将为您的脚本提供一个替代建议,该建议借鉴了删除空白

  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

我调试这种情况的方法:

  1. 哪个 shell 正在执行您的脚本?放在 ”#!“到它工作的外壳(你说它在你的命令行中工作)
  2. 如果您将脚本更改为直接执行“wget网址“, 在哪里URL 是硬编码的到输出$URL,它会得到文件吗?
  3. 如果你采取其他一些网址从其他网站,它会工作吗?
  4. 如果您可以访问该网站,您可以检查一下吗?访问日志和错误日志网络服务器的?
  5. 什么是退出状态的 wget ?了解什么是“echo $?”会有所帮助。显示,比较http://www.gnu.org/software/wget/manual/wget.html#Exit-Status

相关内容