2013-08-15 3 views
1

Я пишу простой скрипт bash (checkServs.sh), который будет ssh в список серверов и проведет проверку работоспособности.Что случилось с этим списком серверов в моем сценарии bash?

Я постоянно получаю ошибки на следующей строке:

SERVERS=(blah1.example.com blah2.example.com blah3.example.com blah4.example.com) 

Ошибка:

checkServs.sh: 3: checkServs.sh: Syntax error: "(" unexpected 

Я проверил онлайн примеры, и это кажется правильным, не так ли? Заранее спасибо!

+1

Вы используете '/ bin/sh' или'/bin/bash'? Проблема заключается в том, что оболочка, которую вы используете, не распознает нотацию массива. Является ли '/ bin/sh' фактически ссылкой на другую оболочку? ('/ bin/sh' как ссылка на'/bin/bash', похоже, распознает назначение массива.) –

+0

@JonathanLeffler, но в качестве ссылки на 'dash' он не делает и производит ту же синтаксическую ошибку. Может быть, все. Я обновлю эту информацию. –

ответ

4

Я не знаю, о синтаксической ошибке, но это должно работать:

SERVERS="blah1.example.com blah2.example.com blah3.example.com blah4.example.com" 
for server in $SERVERS 
do 
    echo $server 
done 

EDIT: Как отмечает Джонатан Леффлера в комментарии, может быть, вы не используете скрипт с bash. Другие оболочки, такие как dash, могут не распознавать синтаксис массива. Если это так, то вы можете сделать:

SERVERS=(blah1.example.com blah2.example.com blah3.example.com blah4.example.com) 
for i in $(seq 0 3) 
do 
    echo ${SERVERS[$i]} 
done 

Но если вы просто хотите, чтобы перебрать имена и выполнить команду SSH (т.е. если иметь массив не будет предоставлять полезную функциональность), то первый метод является более простым.

-1

Открывающая скобка запускает подоболочку, что неверно для правой стороны знака равенства. Он ожидает строковое выражение, а не команду.

Котировочные знаки используются для сохранения строкового выражения.

+0

Неверное изображение. В случае присвоения в 'bash', он превращает переменную в массив. В оболочках POSIX, которые не поддерживают массивы (например, 'dash'), это синтаксическая ошибка. – jordanm

0

Возможно, ваш удаленный сервер вызывает другую оболочку при выполнении команд. Попробуйте добавить Баш -c к вашим аргументам:

ssh [email protected] bash -c "<your commands>" 

Или:

ssh [email protected] bash < yourscript.sh ## None in yourscript.sh must read input though.