«Синтаксическая ошибка:« («неожиданно» при создании массива

37

У меня есть два (Debian) сервера Linux. Я создаю сценарий оболочки.

На первом я создаю массив таким образом:

#!/bin/bash
target_array=(
    "/home/user/direct/filename -p123 -r"
)

Это отлично работает. Но когда я запускаю это на другом сервере, я получаю:

Syntax error: "(" unexpected

Насколько я могу судить, оба сервера одинаковы. Может кто-нибудь пролить свет на то, почему это не работает?

Если я ввожу это непосредственно в терминал, это нормально ??


Казалось бы, когда я запускаю его как

sh scriptname.sh

Я получаю сообщение об ошибке, но если я запускаю его как

./scriptname.sh

кажется, все в порядке. Какая разница?

IGGt
источник
Вы скопировали сценарий между двумя серверами? попытаться cat -v <script>увидеть, есть ли ложный символ.
LilloX
2
shне bashтак и так работает, как sh scriptname.shне правильно
Эрик Ренуф

Ответы:

56

Когда вы используете, ./scriptname.shон выполняется с, /bin/bashкак в первой строке с #!. Но когда вы используете sh scriptname.shэто выполняется sh, нет bash.

У shоболочки нет синтаксиса для создания массивов, но у Bash есть синтаксис, который вы использовали.

Константин Моренко
источник
Хорошо, теперь это имеет смысл. Как вы, вероятно, можете сказать, я довольно новичок в Linux (в настоящее время пытаюсь конвертировать мои скрипты Powershell в shell / bash). Я буду придерживаться использования ./с этого момента. ура
IGGt
Это не обязательно, но между #!/bin/shи sh script.sh(или #!/bin/bashи bash script.sh) должна быть координация
Константин Моренко
3
Язык sh не имеет массивов ( a[index]=xили a=(x y)). Некоторые интерпретаторы sh поддерживают массивы, только ksh88 (не портированный на Linux AFAIK) и некоторые старые версии pdksh будут поддерживать a[index]=valueи не поддерживать a=(x y). В Debian shобычно dashне поддерживает массив ( a[index]=xне работает).
Стефан Шазелас
1
Теперь я могу умереть по частям! :)
Пауло
0

В ./scriptname.shрезультате выполнения будет прочитана первая строка файла, и он увидит, что ему нужно запустить «/ bin / bash» и передать оставшуюся часть скрипта интерпретатору, а при выполнении sh scriptname.shфайл передается в стандартную оболочку пользователя (например, Ash). и быть в том случае, если этот другой интерпретатор не поддерживает массивы, как это делает Bash.

dave_alcarin
источник
1
shэто не обязательно «стандартная оболочка пользователя», это часто его собственный исполняемый файл (или символическая ссылка), shкоторый будет вызываться для обработки скрипта. Это будет верно, если даже если оболочка входа по умолчанию для этого пользователяbash
Эрик Ренуф
Это была та часть, в которой я не был полностью уверен в данный момент. Благодарю за разъяснение!
dave_alcarin
0

С sh scriptname.sh, вы запускаете его с sh, не обязательно с bash. Попробуйте сравнить sh --versionна обеих машинах. И / или с dpkg -S $(which sh).

joepd
источник
Даже если shэто символическая ссылка на bashнего будет вести себя по-другому, когда вызывается какsh
Эрик Ренуф