我编写了一个简单的脚本,我想在多个主机上运行它。 (即,我想运行一个实例脚本,但让其在多个主机上运行。)脚本有效,但仅适用于第一台主机。当我添加多个主机时,我收到一条错误消息:
line 3: MACHINE2: command not found
我究竟做错了什么?脚本发布在下面。
#!/bin/sh
HOSTS=MACHINE1 MACHINE 2
for i in $HOSTS; do echo $i
ssh -q $i uname -a;
done
答案1
像这样的命令
xyz=abc def ghi jkl
表示使用def
参数ghi
和运行程序jkl
,并将环境变量xyz
设置为abc
。设置HOSTS
为字符串
MACHINE1 MACHINE 2
你需要说
HOSTS="MACHINE1 MACHINE 2"
(尽管我假设您不想在第二个MACHINE
和之间有空格2
。)您可能可以使其工作,因为主机名不包含空格或其他特殊字符。然而,使用数组可能更聪明:
HOSTS=(MACHINE1 MACHINE2)
for i in "${HOSTS[@]}"
do
echo "$i"
ssh -q "$i" uname -a
done
此结构允许您拥有带有特殊字符的多字数组元素:
lyrics=("Twinkle twinkle little *" "How I wonder what you are")
for line in "${lyrics[@]}"
do
printf "%s\n" "$line"
done
请注意,您应该始终引用所有 shell 变量引用(例如,"${HOSTS[@]}"
和"$i"
),除非您有充分的理由不这样做,并且您当然你知道你在做什么。还,
- 行尾不需要分号。
- 在 shell 脚本中,通常使用小写字母作为脚本变量名称,因为传统上系统变量均使用大写字母。
echo
对于打印固定字符串很方便,但它可以用任意数据做意想不到的事情。它是远的使用更安全printf
。