2017-04-25 86 views
0
#!/bin/bash 
echo "Number of hosts entered are "$# 
echo "Hostnames are "[email protected] 
for i in "[email protected]" 
do 
    echo "Logging in to the host "$i 
    pbsh [email protected]$i ' 
    ipaddr=`ip r | awk '{print $9}'` 
    if [ ipaddr = 172.*.*.* ] 
    then 
     echo "Script can not be run in this IP series" 
     exit 
    else 
     cd /var/tmp ; wget http://********** 
    fi' 
done 

執行上述腳本後,它將拋出錯誤。該腳本正在執行,但不是以所需的方式。無法通過在shell腳本中使用awk命令進行打印

awk:cmd。行:1:{print

awk:cmd。行:1:^意外的換行符或字符串的結尾

我是新手到腳本。如果腳本中有任何錯誤,請糾正我。

+1

你主要的問題是'''在'pbsh'結尾處的'''','''awk'中的另一個'''結束了,所以你可能想通過'\'來逃避後者。另一件事是你的'if'語句,除非你檢查變量'$ ipaddr'而不是** ipaddr **字符串,否則這將永遠不會成立。 – Rogus

回答

0

在您發佈的列表中,pbsh一行中的開頭單引號緊接着是單引號,緊接着是awk命令。您可以通過在反斜槓前添加前綴來避開後者。

如果pbsh也接受從stdin執行的命令,另一種方法是使用HERE文檔(請參閱bash手冊頁,這裏的文檔)。

更新:戈登戴維森在他的評論是正確的。 \'也不起作用。 pbsh堅持讓作爲單個參數要執行的命令,你可以任意擺弄的報價,因爲他建議,或把整個輸入pbsh到一個單獨的文件和使用,即

pbsh [email protected]$i $(<input_script.pbsh) 
+1

使用反斜槓進行轉義不適用於單引號字符串。您需要結束單引號字符串,然後使用轉義的單引號,然後啓動一個新的單引號字符串。像這樣的:'awk'\''{print $ 9}'\'''。如果'pbsh'命令接受它,一個here文件(帶有引號的分隔符)會更簡單。 –

+0

它修改後像awk'\''{print $ 9}'\''。但腳本在執行時完全顯示if語句塊。我會檢查並使用這裏的文件。希望它會很好。 – Veer

+0

@Veer:記下我更新的答案。也許這導致更可維護的解決方案。 – user1934428