我正在寻找编写一个 Bourne shell,它可以循环遍历主机数组并对每个主机执行 rsync。类似于:
HOSTS=("host1.domain.com", "host2.domain.com")
for HOST in $HOSTS
do
HOST_DIR_NAME = ${HOST//./-}
rsync backup_user@$HOST:/backup/blah/blah /backup/$HOST_DIR_NAME/blah/blah
done
然而,问题是,上面的数组似乎没有按预期工作,因为循环遍历数组时我看到以下输出:
wwcprod.plyinc.com,
我发现的每份在线指南都说我正确地定义了数组,但它显然不起作用。救命!
谢谢!
答案1
您的理想解决方案比 bash 数组简单得多(并且更易于移植到非 bash bourne 风格的 shell):
HOSTS="one two three four"
for H in $HOSTS ; do
[... whatever for ${H} ...]
done
将for
在字符串内的空格处进行拆分:-)
答案2
您必须使用@
或*
来访问数组中的项目(信息通常隐藏在bash 文档):
HOSTS=(host1.domain.com host2.domain.com)
for HOST in ${HOSTS[@]}
do
HOST_DIR_NAME=${HOST//./-}
rsync backup_user@$HOST:/backup/blah/blah /backup/$HOST_DIR_NAME/blah/blah
done
使用逗号作为项目分隔符是错误的,引号是为了防止空格和 shell 扩展。空格也是有意义的:HOST_DIR_NAME = ...
期望一个命令命名HOST_DIR_NAME
并使用它= ...
作为参数启动,而是HOST_DIR_NAME=...
一个赋值。
我还必须不同意之前的一些评论:由于文件名带有空格,我经常需要在 Bash 中使用数组。