2017-10-04 82 views
0

我刚刚尝试重写我的代码时出现此错误。通过变量冲突的grep&wget

此代码按预期工作:

#XML downloading 
wget -q http://192.168.50.154/details.xml -O details.xml 

#load XML in Variable 
rohxml=details.xml 

#Read Data and save to Variable 
health=$(grep '<Health' $rohxml | cut -f2 -d">"|cut -f1 -d"<") 

但是,当我尝试将其直接保存到一个变量(因为我无法保存在新服务器的新文件),它抛出我下面的错误:

grep: invalid option -- 'O' Usage: grep [OPTION]... PATTERN [FILE]... Try 'grep --help' for more information.

这是 “新” 的代码:

#load XML in Variable 
ABFRAGE="'wget -q -O- http://192.168.50.154/details.xml'" 
rohxml=$ABFRAGE 

#Read Data and save to Variable 
health=$(grep '<Health' $rohxml | cut -f2 -d">"|cut -f1 -d"<") 
+0

你知道你存放在变量wget命令行,然后执行它grep命令行而不是将命令的输出保存在变量中,对吗?不要这么做 - 这就是功能。正如你所写的,当你从某些目录等运行它时,你会暴露自己的令人讨厌的惊喜,因为你将命令暴露给shell进行通配符扩展,通配符,分词等。 –

+0

不要将“已解决”添加到标题。为了表明你的问题已经得到解答,请接受一个答案(通常你也想要赞成它)。如果现有的答案都不能解决您的问题,您可以自行发布并接受答案。 –

回答

0

你如何壳工程的一些基本误解。试试这个:

rohxml="$(wget -q -O- 'http://192.168.50.154/details.xml')" 
health="$(awk -F'[<>]' '/<Health/{ print $3 }' <<<"$rohxml")" 
printf 'health="%s"\n' "$health" 

然后问你是否有问题。我假设你有一些使用的变量rohxmlhealth超越,否则你发布你所需要的代码是:

wget -q -O- 'http://192.168.50.154/details.xml' | 
awk -F'[<>]' '/<Health/{ print $3 }' 
2

您存储字符串

'wget -q -O- http://192.168.50.154/details.xml' 

在$ rohxml变量中,而不是命令的输出。使用反引号来存储输出。

此外,要从XML中提取信息,请使用XML认识工具。对于简单的查询,xmllint应该工作得很好。

+0

现在我有 ABFRAGE =“'wget -q -O- http:// 192.168.50.154/details.xml'” 但现在它不正确解析命令(我从其他XML的东西得到的错误, m没有通过grep) – MrPoPoPolski

+1

@MrPoPoPolski你需要使用'var = $(command)'来代替。你也希望在你的'grep'命令中用双引号括起变量 – Aaron

0

我只是再次,现在我重写代码只需使用以下命令,它的正常工作

wget -O - -o /dev/null http://192.168.50.154/details.xml | sed -n 's:.*<Health>\(.*\)</Health>.*:\1:p'