我正在寻找编写一个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,
我发现每一个在线指南说,我正确定义arrays,但显然不工作。 帮帮我!
谢谢!
你的理想解决scheme比bash数组简单得多(而且对于非bash的bourne风格的shell更具移植性):
HOSTS="one two three four" for H in $HOSTS ; do [... whatever for ${H} ...] done
for会将string中的空格分割:-)
您必须使用@或*来访问数组中的项目(像往常一样在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=...它,而HOST_DIR_NAME=...是一个赋值。
我还必须不同意以前的一些评论:我经常需要在Bash中使用数组,因为文件名带有空格。