在远程服务器内部我有一个条件语句。如果该条件通过 状态值应设置为成功。
但是在这里,我总是在打印状态变量时得到失败响应
status ='成功';
status='Success';
# !/bin/bash
declare -a server_PP=('XXXXX' 'YYYYYYY' );
declare -A results_map;
function process(){
serverList=$1[@];
servers=("${!serverList}");
status='Failure';
for serverName in "${servers[@]}"
do
ssh $serverName << EOF
if [ -f /app/Release/abc.war ]; then
echo "available - success"
status='Success';
fi
echo "***********status-inside******$status"
exit
EOF
echo "***********status-outside******$status"
results_map+=([$serverName]=$status);
done
}
process 'server_PP'
for i in "${!results_map[@]}"
do
echo "key :" $i
echo "value:" ${results_map[$i]}
done
当满足该条件时,状态变量应设置为成功。
答案 0 :(得分:1)
如pcarter的评论所述,这两个系统上的变量彼此独立,并且不会通过ssh
进行传递。代替设置变量(或按照注释中的建议打印和读取值,这是一种可行的解决方案),您可以使用退出代码,该退出代码由ssh
自动传递。
以下脚本接近原始脚本。有关进一步的改进,请参见下文。
# !/bin/bash
declare -a server_PP=('XXXXX' 'YYYYYYY' );
declare -A results_map;
function process(){
serverList=$1[@];
servers=("${!serverList}");
status='Failure';
for serverName in "${servers[@]}"
do
if ssh $serverName << EOF
if [ -f /app/Release/abc.war ]; then
echo "available - success"
exit 0;
fi
echo "error"
exit 1
EOF
then
status='Success'
else
status='Failure'
fi
echo "***********status-outside******$status"
results_map+=([$serverName]=$status);
done
}
process 'server_PP'
for i in "${!results_map[@]}"
do
echo "key :" $i
echo "value:" ${results_map[$i]}
done
由于不再需要变量分配,因此甚至可以在远程命令中省略if ...
和exit
。
if ssh $serverName << EOF
[ -f /app/Release/abc.war ]
EOF
then
...
您将Heredoc用作
的方法ssh hostname <<EOF
# commands ...
EOF
的缺点是您在远程系统上运行交互式外壳程序,该外壳程序在执行命令之前可能会打印一些系统信息或欢迎消息。通过将命令或脚本指定为ssh
的命令行参数,可以进一步简化脚本(并删除欢迎消息)。
if ssh $serverName [ -f /app/Release/abc.war ]
then
...
如果命令序列较长,则可以在远程系统上创建脚本并以与ssh hostname scriptname
相同的方式运行此脚本。您还可以使用ssh
或scp
在远程系统上创建脚本。