将命令输出设置为变量值

时间:2019-05-13 16:03:20

标签: bash

我想确定我的4个节点群集上哪个节点处于活动状态。 我还想将当前活动节点的名称添加到脚本中。

这是我的代码:

#!/bin/bash
dev1=10.1.1.1
dev2=10.1.1.2
dev3=10.1.1.3
dev4=10.1.1.4
/usr/bin/ssh -x root@${dev1} $'command  | grep -Eo "active"'
/usr/bin/ssh -x root@${dev2} $'command  | grep -Eo "active"'
/usr/bin/ssh -x root@${dev3} $'command  | grep -Eo "active"'
/usr/bin/ssh -x root@${dev4} $'command  | grep -Eo "active"'

因此,我想以这种形式获取此变量(我想在脚本的其他部分中使用它):

active=$dev2

她是我当前的输出:

sh -x s.sh
+ dev1=10.1.1.1
+ dev2=10.1.1.2
+ dev3=10.1.1.3
+ dev4=10.1.1.4
+ /usr/bin/ssh -x root@10.1.1.1 'command | grep -Eo "active"'
+ /usr/bin/ssh -x root@10.1.1.2 'command | grep -Eo "active"'
+ /usr/bin/ssh -x root@10.1.1.3 'command | grep -Eo "active"'
active
+ /usr/bin/ssh -x root@10.1.1.4 'command | grep -Eo "active"

1 个答案:

答案 0 :(得分:0)

假设通常只有一台活动主机,但是仍然可以防范极端情况,则可以这样编写:

#!/bin/bash

declare -a dev             # hold hosts in indexed array
declare -i numActive=0     # hold number of active hosts in integer variable
declare -i lastActive=     # last active host while iterating

dev[1]=10.1.1.1
dev[2]=10.1.1.2
dev[3]=10.1.1.3
dev[4]=10.1.1.4

for(( i=1 ; i<=${#dev[@]} ; i++ )) ; do

  # execute command on that host:
  output=$( /usr/bin/ssh -x "root@${dev[$i]}" 'command' )

  # if the host is active, remember its index and 
  # increase the count of active hosts:
  if grep -qEo "active" <<< "$output" ; then
    lastActive="$i"
    numActive=$(( numActive + 1 ))
  fi
done

# depending on number of active hosts, print 
# "none", "multiple" or the active host's ip:

if [ "$numActive" -eq 0 ] ; then
  active="none"
elif [ "$numActive" -gt 1 ] ; then
  active="multiple"
else
  active=${dev[$lastActive]}
fi

echo "$active"

请注意,我将grep移到了客户端。如果command产生大量输出,这可能是个坏主意。