Проблема со сценарием Bash: «объявления: не найдены»

У меня был скрипт, который работал нормально, но когда я запускал его сегодня, он говорит declare: not found. Я использую оболочку bash и путь при запуске скрипта правильный.

Две помеченные строки в моем скрипте выглядят следующим образом:

declare -a RESPONSE
RESPONSE=($RESULT)

Также говорится, что ( неожиданно, но я думаю, что это происходит из-за первой ошибки. Стоит упомянуть о том, что когда я печатаю, объявление напрямую работает нормально.

declare | grep USER показывает

USER=ashfame
USERNAME=ashfame
           values="$SVN_BASH_USERNAME";

Итак, что здесь не так?

26
задан 27 February 2011 в 17:42

6 ответов

Вы используете sh вместо bash? sh (связанный с тире ) не поддерживает ни ключевое слово , ни синтаксис

VAR=(list) 

для инициализации массивов.

29
ответ дан 27 February 2011 в 17:42

Как воспроизвести указанную выше ошибку:

Я использую 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
3
ответ дан 27 February 2011 в 17:42

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

Изменить разрешение сценария, например:

chmod 755 script.sh
1
ответ дан 27 February 2011 в 17:42

Я подозреваю, что ваша строка "shebang" (необязательная первая строка файла) ссылается на sh вместо bash. Это должно быть

#!/bin/bash

для bash-скриптов. Если первая строка вашего скрипта имеет значение

#!/bin/sh

, то это будет означать, что будет использоваться оболочка, строго совместимая с Борном; в случае с Ubuntu используется тире dash. Во многих других дистрибутивах это не вызывает проблем, так как они связывают /bin/sh с /bin/bash; однако, ubuntu связывает с /bin/dash, чтобы позволить системным скриптам работать быстрее.

Сборка declare является одним из многих расширений bash к спецификации скрипта Bourne shell; dash просто реализует эту спецификацию без расширений.

11
ответ дан 27 February 2011 в 17:42

В 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 .

0
ответ дан 27 February 2011 в 17:42

Попробуйте запустить свой сценарий, используя / bin / bash в командной строке, если sh (:

Вместо:

    sh script.sh

Попробуйте:

    /bin/bash script.sh
1
ответ дан 27 February 2011 в 17:42

Другие вопросы по тегам:

Похожие вопросы: