【问题标题】:syntax error near unexpected token `|'意外标记“|”附近的语法错误
【发布时间】:2013-12-11 09:00:57
【问题描述】:

我尝试编写 bash 代码并且我正在使用命令替换。我的代码是这样的:

#!/bin/bash

IP="10.0.0.1 10.0.0.2"
PORT="22 80"
USERNAME="admin"
SCRIPT_HOST="adminHost"
HOME_DIR=/home/admin
SCRIPT_DIR=$HOME_DIR/scripts
script="sudo /my_remote_script.sh"
SSH="/usr/bin/ssh -t -o ConnectTimeout=10 -l ${USERNAME} ${SCRIPT_HOST}"

declare -a array1
declare -a array2
declare -a array3


for ip in ${IP} ; do
    for port in ${PORT} ; do

    rmt_command1=" $script -i $ip -p $port | awk -v IGNORECASE=1 '/pattern1/ {print \$4}' "

    rmt_command2=" $script -i $ip -p $port  | awk -v IGNORECASE=1 '/pattern2/ {print \$5}' "

    rmt_command3=" $script -i $ip -p $port | awk -v IGNORECASE=1 '/pattern3/ {print \$5}' "

    array1[$ip,$port]=$($SSH "$rmt_command1")
    array2[$ip,$port]=$($SSH "$rmt_command2")
    array3[$ip,$port]=$($SSH "$rmt_command3")

    done
done

for ip in ${IP}

    for port in ${PORT}
    printf   ${array1[$ip,$port]}
    printf   ${array2[$ip,$port]}
    printf   ${array3[$ip,$port]}

done

我收到如下错误消息:

./test_sh: line 20: syntax error near unexpected token `|'
./test_sh: line 20: ` rmt_command1=" $script -i $ip -p $port | awk -v IGNORECASE=1 '/pattern1/ {print \$4}' "'

可能出了什么问题?

【问题讨论】:

  • 如果要执行命令,则语法为var=$(command)。使用rmt_command1=" $script ... 你不会得到它。
  • ${IP}" 看起来不对 - 你的意思是 "${IP}" 还是 ${IP}
  • 是 ${IP},已更正。
  • 注意关联数组是用declare -A而不是declare -a声明的
  • 我没有看到任何语法错误。 rmt_command1 之前可能有一些奇怪的空格。有点长,但是您能否将hexdump -C script.sh(其中script.sh 是您的文件名)的输出添加到问题中?如果/一旦我们发现问题,我们可以编辑掉不相关的部分。

标签: arrays bash ssh awk pipe


【解决方案1】:

我在没有阅读错误信息的情况下看到了这个问题:

for ip in ${IP}

     for port in ${PORT}
         printf   ${array1[$ip,$port]}
         printf   ${array2[$ip,$port]}
         printf   ${array3[$ip,$port]}

done

您缺少一个done 和两个do

 for ip in "$IP"; do
      for port in "$PORT"; do
          printf   "${array1[$ip,$port]}"
          printf   "${array2[$ip,$port]}"
          printf   "${array3[$ip,$port]}"
      done
 done

然后,${IP}${PORT} 上的 {} 是无用的,如果不是,不像双引号。

否则,对于您的错误消息,您可以尝试删除管道周围的空格 (|)。

【讨论】:

  • 发布的问题似乎从未丢失过dodone 关键字。
  • 我引用了我看到的错误,即使它们出现在提到的错误消息之后。然后,对于错误消息,我还提供了一个带有可能格式错误的空格的轨道。
  • 我错过了脚本的底部。这确实是一个问题,尽管它发生得太晚而不会导致提供的语法错误。 | 周围的空格应该不是问题,因为它只是一个字符串赋值。有东西干扰了整个语句的解析。
猜你喜欢
  • 2012-08-31
  • 2012-10-20
  • 2012-09-29
  • 1970-01-01
  • 1970-01-01
  • 2014-09-01
  • 2014-02-26
  • 2018-12-18
相关资源
最近更新 更多