【问题标题】:Unable to print by using awk command in the shell script无法在 shell 脚本中使用 awk 命令进行打印
【发布时间】:2017-04-25 04:35:02
【问题描述】:
#!/bin/bash
echo "Number of hosts entered are "$#
echo "Hostnames are "$@
for i in "$@"
do
    echo "Logging in to the host "$i
    pbsh root@$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

执行上述脚本后,它会抛出以下错误。脚本正在执行,但不是以所需的方式。

awk:命令。行:1:{打印

awk:命令。 line:1: ^ 意外的换行符或字符串结尾

我是脚本的新手。如果脚本中有任何错误,请纠正我。

【问题讨论】:

  • 您的主要问题是pbsh 末尾的',它由您的awk 中的另一个' 结束,因此您可能想通过执行@987654326 来逃避后者@。另一件事是您的 if 声明,除非您检查变量 $ipaddr 而不是 ipaddr 字符串,否则它永远不会是真的。

标签: linux bash shell awk scripting-language


【解决方案1】:

在您发布的清单中,pbsh 行中的开始单引号由单引号关闭,紧随其后的是 awk 命令。您可以通过在后面加上反斜杠来转义后者。

如果 pbsh 也接受从标准输入执行的命令,另一种选择是使用 HERE 文档(请参阅 bash 手册页的 Here Documents 部分)。

更新:戈登戴维森的评论是正确的。 \' 也不起作用。 pbsh 坚持让命令作为单个参数执行,您可以按照他的建议摆弄引号,或者将 pbsh 的整个输入放入单独的文件中并使用,即,

pbsh root@$i $(<input_script.pbsh)

【讨论】:

  • 用反斜杠转义在单引号字符串中不起作用。您需要结束单引号字符串,然后使用转义的单引号,然后开始一个新的单引号字符串。像这样的东西:awk '\''{print $9}'\''。如果pbsh 命令接受它,则此处的文档(带有引号分隔符)会更简单。
  • 像 awk '\''{print $9}'\'' 这样修改后它工作了。但是脚本在执行时会完全显示 if 语句块。我将检查并使用此处的文档。希望一切顺利。
  • @Veer:注意我更新的答案。也许这会带来更易于维护的解决方案。
猜你喜欢
  • 2018-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多