`Помилка синтаксису:“ (“несподівано” під час створення масиву


37

У мене є два (Debian) Linux-сервери. Я створюю сценарій оболонки.

На першому я створюю масив таким чином:

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

Це прекрасно працює. Але коли я запускаю це на іншому сервері, я отримую:

Syntax error: "(" unexpected

Наскільки я можу сказати, обидва сервери однакові. Чи може хтось пролити світло на те, чому це не працює?

Якщо я введу його безпосередньо в термінал, це добре?


Здавалося б, коли я запускаю це як

sh scriptname.sh

Я отримую помилку, але якщо я запускаю її як

./scriptname.sh

здається, це нормально. Яка різниця?


Ви скопіювали сценарій між двома серверами? спробуйте cat -v <script>переконатися, чи є помилкові знаки.
LilloX

2
shце не bashтак, і це так, як sh scriptname.shце неправильно
Ерік Реноф

Відповіді:


56

При використанні ./scriptname.shвін виконується з, /bin/bashяк у першому рядку з #!. Але коли ви користуєтесь sh scriptname.shнею виконує sh, не bash.

shОболонка не має синтаксису для створення масивів, але Bash має синтаксис , який ви використовували.


Гаразд, це має сенс зараз. Як ви, напевно, можете сказати, що я досить новачок в Linux (зараз намагаюся конвертувати мої сценарії Pollshell 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.


1
shне обов'язково є "стандартною оболонкою користувача", вона часто має власний виконуваний файл (або symlink), і shвін буде викликаний для обробки сценарію. Це буде правдою, якщо навіть якщо для цього користувача оболонка для входу за замовчуванням єbash
Ерік Реноф

Це була та частина, в якій я був не зовсім впевнений на даний момент. Дякуємо за роз’яснення!
dave_alcarin

0

З sh scriptname.sh, ви працюєте з ним sh, не обов'язково з bash. Спробуйте порівняти sh --versionна обох машинах. І / або з dpkg -S $(which sh).


Навіть якщо shце посилання на bashнього, він поводитиметься інакше, коли його викликають якsh
Ерік Реноф
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.