unix 如果在shell脚本中,则无法使用EOT

bejyjqdl  于 2022-11-04  发布在  Unix
关注(0)|答案(3)|浏览(196)

无法在if中使用ssh命令结束传输(EOT),它会产生编译错误。我试过使用〈〈-EOT和〈〈〈EOT,但没有任何效果。有人能提出解决这个问题的建议吗?


# !bin bash

if [ -z "$2" ];
  then
    rsync -a abc.tgz root@$1:/var/folder1
    echo "Done upload"

    # Change permissions of agent image and create image configuration
    ssh -o IdentitiesOnly=yes -o StrictHostKeyChecking=no root@$1<<EOT
    chmod 644 /var;
    echo "image.id=$containerSha" > /var;
    EOT
else
    rsync -a abc.tgz root@$1:/var
    echo "Upload done"

    ssh -o IdentitiesOnly=yes -o StrictHostKeyChecking=no root@$1<<EOT
    cd /var;
    sshpass -p '$3' rsync -a abc.tgz root@$2:/var;
    sshpass -p '$3' ssh root@$2 'chmod 777 /var/*; ls -ltr';
    EOT
fi
exit
cbwuti44

cbwuti441#

通过Shellcheck运行脚本会发现以下错误(沿着形状不正确的shebang行):

Line 12:
    EOT
^-- SC1039 (error): Remove indentation before end token
    (or use <<- and indent with tabs).

Line 21:
    EOT
^-- SC1039 (error): Remove indentation before end token
    (or use <<- and indent with tabs).

Line 23:
exit
    ^-- SC1072 (error): Here document was not correctly terminated.
    Fix any mentioned problems and try again.

EOT标记 * 不能 * 缩进。

ftf50wuq

ftf50wuq2#

我刚刚遇到这个问题,删除缩进将解决这个问题:
而不是:

...
    ssh -o IdentitiesOnly=yes -o StrictHostKeyChecking=no root@$1<<EOT
    chmod 644 /var;
    echo "image.id=$containerSha" > /var;
    EOT
else
...

您可以尝试:

...
ssh -o IdentitiesOnly=yes -o StrictHostKeyChecking=no root@$1<<EOT
chmod 644 /var;
echo "image.id=$containerSha" > /var;
EOT
else
...
p3rjfoxz

p3rjfoxz3#

如果我没有弄错的话,EOT是数值为4的字符。

eot=$'\004'

您可以稍后使用${eot}表示传输结束。

UPDATE:我的答案是关于在bash程序中表示传输结束字符的问题。正如AKX在他的评论中合理地指出的那样,真实的的问题与传输结束无关,而是如何标记here-document的结束。

相关问题