2017-04-25 87 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