使用ssh时,无法在另一个变量“内部”执行变量引用

时间:2017-06-12 11:03:19

标签: bash shell virtual-machine

我编写了一个shell脚本,当在一个vm上运行时,收集用户从不同的vms输入的各种其他服务的状态。代码如下

#!/bin/sh
if [ $# -eq 0 ]
then
echo -e "\n Please pass the service names in the command line argument\n"
exit 1
fi

cl=$#
HOSTS="IP address of hosts"

for HOSTNAME in ${HOSTS}
do
         echo -e "Service status on $HOSTNAME"

         ssh root@$HOSTNAME bash -c '
                  for ((i=1;i<='$cl';i++))
                  do
                     echo $i
                     eval x='\$$i'

                     echo $x
                     service $i  status
                     done                                       '
done

使用eval x='\$$i'时,'x'的值应该是用户传递的参数,但是当我ssh它时,该值不会被解释,而是x的值是$。

x的值应为$ 1,$ 2,依此类推......基于i的值。

例如,如果我提供 ./ test.sh sssd ,那么 x 的值应为 sssd

2 个答案:

答案 0 :(得分:0)

我引用了几个应引用的变量。

请检查以下代码

for HOSTNAME in ${HOSTS}
do
         echo -e "Service status on $HOSTNAME"

         ssh root@"$HOSTNAME" bash -c '
                  for ((i=1;i<='"$cl"';i++))
                  do
                     echo $i
                     eval x='$$i'

                     echo $x
                     service $i  status
                     done                                       '
done

答案 1 :(得分:0)

如果您不尝试重复使用i的值作为位置参数,这会更简单。

ssh root@"$HOSTNAME" bash -c '
  i=0
  for x in "$@"; do
    echo "$i"
    echo "$x"
    service "$i" status
    i=$((i+1))
  done
' _ "$@"

请注意,您还需要将test.sh的参数传递给ssh,以确保它们被传递到远程端的bash脚本。 _是一个伪参数,用于在脚本中设置$0的(未使用)值。

或者,使用间接参数展开而不是eval

ssh root@$HOSTNAME bash -c '
  for ((i=1;i<='$cl';i++))
  do
     echo "$i"
     x=${!i}
     echo "$x"
     service "$i" status
  done
' _ "$@"