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

23

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

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

declare -a RESPONSE
RESPONSE=($RESULT)

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

declare | grep USER шоу

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

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

Ashfame
источник

Ответы:

27

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

VAR=(list) 

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

enzotib
источник
Моя линия Шебанга #!/bin/bashтолько. Вы имели в виду, как я выполняю это? Я просто попытался выполнить это так, ./script.shи это сработало. Но это не работает как script.shили, sh script.shи я почти уверен, что использовал два последних метода, когда создавал их неделю назад. Чем это можно объяснить?
Ashfame
@Ashfame: может быть, неделю назад он пропустил функции, специфичные для bash, которые есть у вас сейчас, поэтому он работал и с sh script.sh
enzotib
Нет, я имел в виду именно этот скрипт, который работал неделю или две недели назад. Или вы имели в виду, что какое-то обновление могло внести изменения?
Ashfame
@Ashfame: я не знаю, этот скрипт, как вы сейчас показываете, не может работать с sh script.sh.
энзотиб
11

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

#!/bin/bash

для скриптов bash. Если первая строка вашего скрипта

#!/bin/sh

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

declareВстроенный в один из bash«S многих расширений спецификации сценариев Bourne оболочки; dashпросто реализует эту спецификацию без расширений.

созерцаемое
источник
#!/bin/bashТолько моя линия
Шебанга
@Ashfame: как у вас работает скрипт? Если вы вызываете его, просто набирая имя скрипта, строка shebang определит, какой интерпретатор его запускает. Однако, если вы явно вызываете его через sh thescript.sh, shоболочка - т.е. dashбудет интерпретировать это.
интуитивно
1
@intuited я прошел через это sh script.sh. Я понимаю, что вы сказали, но я где-то читал, что с помощью этого метода, bashбудет интерпретировать это. Зачем dashему здесь роль? Это только с Ubuntu? Может быть, то, что я прочитал, было для Linux в целом.
Ashfame
2
@Ashfame с sh scriptвами запускает команду shс аргументом script, который заставляет sh читать и выполнять команды в этом файле. Shbang не читается sh, он начинается с a #, поэтому рассматривается как комментарий. Если вы вместо этого запустите ./script, то ядро ​​прочитает shebang, который в вашем случае есть #!/bin/bash, и поэтому он выполняет/bin/bash ./script
geirha
@geirha да, вот как я знаю, что это работает, но @intuited упомянул, что dashбудет использоваться, поэтому мне нужно уточнить это
Ashfame
3

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

Я использую Ubuntu 14.04 64 бит. Поместите этот код в файл:

#!/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
Эрик Лещинский
источник
1

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

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

chmod 755 script.sh
Эдгард Падилья
источник
1

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

Вместо того :

    sh script.sh

Пытаться :

    / bin / bash script.sh
Ходить
источник
1

В 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исправить это.

Рахман Малик
источник