2017-10-04 81 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'