Вы пытаетесь перебрать строку, содержащую значения, а не массив значений.
Обычная оболочка (т. Е. /bin/sh
) может оказаться не самым простым способом решения вашей проблемы. Вам также не нужно использовать awk, perl, python или что-то еще. Просто используйте KornShell (/bin/ksh
или /usr/bin/ksh
в зависимости от вашей среды UNIX). И вы, похоже, действительно создаете скрипт KornShell (test.ksh
).
Я буду использовать /bin/ksh
в macOS.
Теперь перевернуть строку довольно просто:
typeset host='10.0.0.1 10.0.0.2'
typeset -a hosts=( $host )
Теперь hosts
- это массив элементов, которые вы можете перебирать. Вы можете проверить это, набрав:
print -v hosts
, который выдаст:
(
10.0.0.1
10.0.0.2
)
Вы можете упростить приведенный выше код, как показано ниже, но я рекомендую придерживаться приведенного выше синтаксиса:
host='10.0.0.1 10.0.0.2'
hosts=( $host )
Итак, теперь мы знаем, как получить доступ к каждому хосту в вашей строке. Это отвечает на ваш первоначальный вопрос. Однако я бы порекомендовал дальнейшие модификации, чтобы избежать кавычек и проблем с глобализацией.
Для этого я бы рекомендовал использовать отдельный скрипт KornShell, скажем update-remote-crontabs.ksh
, и вызывать его как:
/path/to/update-remote-crontabs.ksh $host
Содержимое сценария:
#! /bin/ksh
typeset user=root
typeset host
for host in $@; do
sshpass -p $user ssh -o StrictHostKeyChecking=no $user@$host \
$'echo \'* * * * * script/test.ksh 6432 '$host' abc xyz\' > /var/spool/cron/user'
done
Обратите внимание на использование $'
для определения строки ANSI C и '$host'
для объединения переменной host
в нашу литеральную строку.
Обратите также внимание на то, что нам не пришлось преобразовывать исходную строку в массив, поскольку это делается автоматически при вызове нашего сценария интерпретатором: -)
Последний комментарий, > /var/spool/cron/root
, насколько мне известно Дурная практика. Вы, вероятно, предпочтете что-то вроде:
(crontab -l; echo '* * * * * script/test.ksh 6432 '$host' abc xyz') | crontab -
Happy KornShell!