我编写了一个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
答案 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
' _ "$@"