У меня был скрипт, который работал нормально, но когда я запускал его сегодня, он говорит declare: not found
. Я использую оболочку bash и путь при запуске скрипта правильный.
Две помеченные строки в моем скрипте выглядят следующим образом:
declare -a RESPONSE
RESPONSE=($RESULT)
Также говорится, что (
неожиданно, но я думаю, что это происходит из-за первой ошибки. Стоит упомянуть о том, что когда я печатаю, объявление напрямую работает нормально.
declare | grep USER
показывает
USER=ashfame
USERNAME=ashfame
values="$SVN_BASH_USERNAME";
Итак, что здесь не так?
Вы используете sh
вместо bash
? sh
(связанный с тире
) не поддерживает ни ключевое слово , ни синтаксис
VAR=(list)
для инициализации массивов.
Я использую 64-разрядную версию Ubuntu 14.04. Поместите этот код в файл:
#!/bin/sh
declare -i FOOBAR=12;
echo $FOOBAR;
Запустите его так:
el@apollo:~$ ./06.sh
./test.sh: 2: ./test.sh: declare: not found
Чтобы исправить это, сделайте следующее:
#!/bin/bash
declare -i FOOBAR=12;
echo $FOOBAR;
Печать:
el@apollo:~$ ./06.sh
12
У меня была такая же проблема, и затем я вспомнил, что вам нужно назначить правильные разрешения для выполнения сценария оболочки.
Изменить разрешение сценария, например:
chmod 755 script.sh
Я подозреваю, что ваша строка "shebang" (необязательная первая строка файла) ссылается на sh
вместо bash
. Это должно быть
#!/bin/bash
для bash-скриптов. Если первая строка вашего скрипта имеет значение
#!/bin/sh
, то это будет означать, что будет использоваться оболочка, строго совместимая с Борном; в случае с Ubuntu используется тире dash
. Во многих других дистрибутивах это не вызывает проблем, так как они связывают /bin/sh
с /bin/bash
; однако, ubuntu связывает с /bin/dash
, чтобы позволить системным скриптам работать быстрее.
Сборка declare
является одним из многих расширений bash
к спецификации скрипта Bourne shell; dash
просто реализует эту спецификацию без расширений.
В Ubuntu у вас может быть сценарий, который выполняет в нем другие сценарии, которые Я столкнулся с.
some_dir/
| main.sh
| shhh.sh
#!/bin/bash -e
echo "file? $0"
# file? ./main.sh
echo "shell? $SHELL"
# shell? /bin/bash
# sh shhh.sh
# file? shhh.sh
# shell? /bin/bash
# shhh.sh: 5: shhh.sh: declare: not found
$SHELL shhh.sh
# file? shhh.sh
# shell? /bin/bash
# foo? bar
#!/bin/bash -e
echo "file? $0"
# shhh.sh
echo "shell? $SHELL"
# shell? /bin/bash
declare foo="bar"
echo "foo? $foo"
Исправлено изменение всех sh some_script.sh
на $ SHELL some_script.sh
.
Попробуйте запустить свой сценарий, используя / bin / bash
в командной строке, если sh
(:
Вместо:
sh script.sh
Попробуйте:
/bin/bash script.sh