Я хочу написать оболочку bourne, которая перебирает массив хостов и выполняет 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,
В каждом онлайн-руководстве, которое я нахожу, говорится, что я правильно определяю массив, но он явно не работает. Помогите!
Спасибо!
Ваше идеальное решение намного проще, чем массив bash (и гораздо более переносимо для оболочек в стиле bourne, отличных от bash):
HOSTS="one two three four"
for H in $HOSTS ; do
[... whatever for ${H} ...]
done
В for
разделится на пробелы внутри строки :-)
Вы должны использовать @
или *
для доступа к элементам в массиве (информация, как обычно, скрывается в документация по 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
Использование запятых в качестве разделителя элементов неверно, а цитирование предназначено для защиты от пробелов и расширения оболочки. Пробелы также имеют значение: HOST_DIR_NAME = ...
ожидает команду с именем HOST_DIR_NAME
и запускает это с = ...
в качестве аргументов, пока HOST_DIR_NAME=...
это задание.
Я также должен не согласиться с некоторыми предыдущими комментариями: мне часто приходится использовать массивы в Bash из-за имен файлов с пробелами.