伯恩壳阵列

伯恩壳阵列

我正在寻找编写一个 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 中使用数组。

相关内容