Назад | Перейти на главную страницу

Массив оболочки Борна

Я хочу написать оболочку 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 из-за имен файлов с пробелами.