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