У меня есть два (Debian) сервера Linux. Я создаю сценарий оболочки.
На первом я создаю массив таким образом:
#!/bin/bash
target_array=(
"/home/user/direct/filename -p123 -r"
)
Это отлично работает. Но когда я запускаю это на другом сервере, я получаю:
Syntax error: "(" unexpected
Насколько я могу судить, оба сервера одинаковы. Может кто-нибудь пролить свет на то, почему это не работает?
Если я ввожу это непосредственно в терминал, это нормально ??
Казалось бы, когда я запускаю его как
sh scriptname.sh
Я получаю сообщение об ошибке, но если я запускаю его как
./scriptname.sh
кажется, все в порядке. Какая разница?
bash
shell-script
array
IGGt
источник
источник
cat -v <script>
увидеть, есть ли ложный символ.sh
неbash
так и так работает, какsh scriptname.sh
не правильноОтветы:
Когда вы используете,
./scriptname.sh
он выполняется с,/bin/bash
как в первой строке с#!
. Но когда вы используетеsh scriptname.sh
это выполняетсяsh
, нетbash
.У
sh
оболочки нет синтаксиса для создания массивов, но у Bash есть синтаксис, который вы использовали.источник
./
с этого момента. ура#!/bin/sh
иsh script.sh
(или#!/bin/bash
иbash script.sh
) должна быть координацияa[index]=x
илиa=(x y)
). Некоторые интерпретаторы sh поддерживают массивы, только ksh88 (не портированный на Linux AFAIK) и некоторые старые версии pdksh будут поддерживатьa[index]=value
и не поддерживатьa=(x y)
. В Debiansh
обычноdash
не поддерживает массив (a[index]=x
не работает).В
./scriptname.sh
результате выполнения будет прочитана первая строка файла, и он увидит, что ему нужно запустить «/ bin / bash» и передать оставшуюся часть скрипта интерпретатору, а при выполненииsh scriptname.sh
файл передается в стандартную оболочку пользователя (например, Ash). и быть в том случае, если этот другой интерпретатор не поддерживает массивы, как это делает Bash.источник
sh
это не обязательно «стандартная оболочка пользователя», это часто его собственный исполняемый файл (или символическая ссылка),sh
который будет вызываться для обработки скрипта. Это будет верно, если даже если оболочка входа по умолчанию для этого пользователяbash
С
sh scriptname.sh
, вы запускаете его сsh
, не обязательно сbash
. Попробуйте сравнитьsh --version
на обеих машинах. И / или сdpkg -S $(which sh)
.источник
sh
это символическая ссылка наbash
него будет вести себя по-другому, когда вызывается какsh