无法通过在shell脚本中使用awk命令进行打印
#!/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:^意外的换行符或字符串的结尾
我是新手到脚本。如果脚本中有任何错误,请纠正我。
在您发布的列表中,pbsh
一行中的开头单引号紧接着是单引号,紧接着是awk
命令。您可以通过在反斜杠前添加前缀来避开后者。
如果pbsh也接受从stdin执行的命令,另一种方法是使用HERE文档(请参阅bash手册页,这里的文档)。
更新:戈登戴维森在他的评论是正确的。 \'
也不起作用。 pbsh坚持让作为单个参数要执行的命令,你可以任意摆弄的报价,因为他建议,或把整个输入pbsh到一个单独的文件和使用,即
pbsh [email protected]$i $(<input_script.pbsh)
使用反斜杠进行转义不适用于单引号字符串。您需要结束单引号字符串,然后使用转义的单引号,然后启动一个新的单引号字符串。像这样的:'awk'\''{print $ 9}'\'''。如果'pbsh'命令接受它,一个here文件(带有引号的分隔符)会更简单。 –
它修改后像awk'\''{print $ 9}'\''。但脚本在执行时完全显示if语句块。我会检查并使用这里的文件。希望它会很好。 – Veer
@Veer:记下我更新的答案。也许这导致更可维护的解决方案。 – user1934428
你主要的问题是'''在'pbsh'结尾处的'''','''awk'中的另一个'''结束了,所以你可能想通过'\'来逃避后者。另一件事是你的'if'语句,除非你检查变量'$ ipaddr'而不是** ipaddr **字符串,否则这将永远不会成立。 – Rogus