declare é uma função incorporada e não está disponível com /bin/sh , apenas com bash ou zsh (e talvez outras camadas). A sintaxe pode diferir de um shell para outro. Você deve escolher seu sheebang ( #! ) de acordo.
Aqui está um exemplo simples mostrando que usando declare em um script, o script não será executado, enquanto o script será fornecido:
$ cat /tmp/new
#! /bin/sh
declare -i hello
$ chmod a+rwx /tmp/new
$ /tmp/new
/tmp/new: 3: declare: not found
$ source /tmp/new
$
Eu me pergunto por que executar diretamente o script não funciona, enquanto o sourcing funciona? Como posso fazer o primeiro trabalho? Obrigado!
declare é uma extensão bash e zsh. No seu sistema, /bin/sh não é nem bash nem zsh (provavelmente é cinza), portanto declare não está disponível. Você pode usar typeset em vez de declare ; eles são sinônimos, mas typeset também funciona no ksh. Em cinza, não há equivalente a typeset -i ou a maioria dos outros usos do typeset embutido. Você não precisa realmente de typeset -i para declarar uma variável inteira; tudo o que ele faz é permitir alguns atalhos sintáticos como hello=2+2 para hello=$((2+2)) .
declare provavelmente não existe no shell definido por sua - #! /bin/sh .
Experimente #!/bin/bash .
A razão pela qual o sourcing funcionou é que você já estava em um shell que suporta declare. Sourcing não abriu um novo shell, portanto não usou o shebang que não sabe declarar.
Você também pode tentar as duas outras versões equivalentes para declare do Bash, que são: typeset e local . Todos eles trabalham com -i (para inteiro ). Veja também meu script de teste . PS. declare ainda não está implementado no Android (Mksh).
Tags bash shell-builtin