Problema com o script Bash: 'declare: not found'


23

Eu tinha um script que estava funcionando bem, mas quando o executei hoje, ele diz declare: not found. Estou usando o shell bash e o caminho no início do script está correto.

Duas linhas sinalizadas no meu script são as seguintes:

declare -a RESPONSE
RESPONSE=($RESULT)

Também diz que (é inesperado, mas acho que está chegando por causa do primeiro erro. Vale mencionar que é quando eu digito declarar que funciona diretamente bem.

declare | grep USER mostra

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

Então, o que há de errado aqui?

Respostas:


27

Você está usando em shvez de bash? sh(vinculado a dash) não suporta declarepalavras-chave nem a sintaxe

VAR=(list) 

para inicializar matrizes.


Minha linha shebang é #!/bin/bashapenas. Você quis dizer como eu o executo? Eu apenas tentei executá-lo como ./script.she funcionou. Mas ele não funciona como script.shou sh script.she estou bastante certo de que eu costumava usar apenas os dois últimos métodos, enquanto eu o criei uma semana atrás. O que poderia explicar isso?
— Ashfame 27/02

@Ashfame: talvez uma semana atrás ele perdeu a recursos específicos para bater você tem agora, para que também trabalhou com script.sh sh
— enzotib

Não, eu quis dizer exatamente esse script costumava funcionar uma ou duas semanas atrás. Ou você quis dizer que alguma atualização pode ter sido alterada?
— Ashfame 27/02

@ Ashfame: Eu não sei, esse script, como você mostra agora, não pode funcionar com sh script.sh.
— enzotib 27/02

11

Eu suspeito que sua linha "shebang" (a primeira linha opcional do arquivo) esteja shfazendo referência a ele bash. Deveria ser

#!/bin/bash

para scripts bash. Se a primeira linha do seu script for

#!/bin/sh

isso indicaria que um invólucro estritamente compatível com bourne deve ser usado; no caso do Ubuntu, dashé usado. Em muitas outras distribuições, isso não causa um problema, porque eles se vinculam /bin/sha /bin/bash; no entanto, o ubuntu se conecta a /bin/dashfim de permitir que os scripts do sistema sejam executados mais rapidamente.

O declarebuiltin é uma das bashmuitas extensões da especificação de script de shell Bourne; dashapenas implementa essa especificação sem extensões.


Minha linha de shebang é #!/bin/bashapenas #
— 2727 Ashfame

@ Ashfame: como você está executando o script? Se você o estiver chamando apenas digitando o nome do script, a linha shebang determinará qual intérprete o executa. No entanto, se você invocá-lo explicitamente via sh thescript.sh, o shshell - ou seja, dashirá interpretá-lo.
— intuited

1
@intuited Eu estava passando por isso sh script.sh. Entendo o que você disse, mas li em algum lugar que, com esse método, basho interpretará. Por que dashconseguiria esse papel aqui? É apenas com o Ubuntu? Pode ser o que eu li foi para linux em geral.
— Ashfame 27/02

2
@Shshame com sh scriptvocê está executando o comando shcom o argumento script, o que faz sh ler e executar os comandos nesse arquivo. O shebang não é lido por sh, ele começa com a #, por isso é tratado como um comentário. Se você em vez executado ./script, então o kernel irá ler o shebang, que no seu caso é #!/bin/bash, e assim ele executa/bin/bash ./script
— geirha

@geirha sim isso é como eu sei que funciona, mas menção @intuited que dashserá usado, então eu preciso esclarecer isso
— Ashfame

3

Como reproduzir o erro acima:

Estou usando o Ubuntu 14.04 de 64 bits. Coloque este código em um arquivo:

#!/bin/sh 
declare -i FOOBAR=12; 
echo $FOOBAR; 

Execute-o assim:

el@apollo:~$ ./06.sh 
./test.sh: 2: ./test.sh: declare: not found

Para corrigi-lo, faça o seguinte:

#!/bin/bash
declare -i FOOBAR=12;
echo $FOOBAR;

Impressões:

el@apollo:~$ ./06.sh 
12

1

Eu tive o mesmo problema e lembrei-me de que você precisa atribuir as permissões corretas para executar o shell script.

Altere a permissão do script, por exemplo:

chmod 755 script.sh

1

Tente executar seu script usando /bin/bashna linha de comando, se sh(:

Ao invés de :

    sh script.sh

Experimentar :

    / bin / bash script.sh

1

No Ubuntu, você pode ter um script que esteja executando outros scripts nele, nos quais eu encontrei.

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"

Alterando tudo sh some_script.shpara $SHELL some_script.shcorrigi-lo.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.