`Erro de sintaxe:" ("inesperado" ao criar uma matriz

37

Eu tenho dois servidores Linux (Debian). Estou criando um script de shell.

No primeiro, crio uma matriz assim:

#!/bin/bash
target_array=(
    "/home/user/direct/filename -p123 -r"
)

Isso funciona bem. Mas quando eu executo isso no outro servidor, recebo:

Syntax error: "(" unexpected

Tanto quanto posso dizer, os dois servidores são iguais. Alguém pode esclarecer por que isso não funciona?

Se eu digitar diretamente no terminal, tudo bem?


Parece que quando eu o executo como

sh scriptname.sh

Eu recebo o erro, mas se eu executá-lo como

./scriptname.sh

parece estar bem. Qual é a diferença?

IGGt
fonte
Você copiou e colou o script entre os dois servidores? tente cat -v <script>ver se há caracteres espúrios.
precisa saber é o seguinte
2
shnão é bashe assim por executá-lo como sh scriptname.shestá errado
Eric Renouf

Respostas:

56

Quando você o usa ./scriptname.sh, executa com /bin/bashcomo na primeira linha com #!. Mas quando você usa sh scriptname.shele executa sh, não bash.

O shshell não tem sintaxe para criar matrizes, mas o Bash tem a sintaxe que você usou.

Konstantin Morenko
fonte
OK, isso faz sentido agora. Como você provavelmente pode dizer, eu sou bastante novo no Linux (atualmente tentando converter meus scripts shell / bash de scripts do Powershell). Vou continuar usando ./agora. aplausos
IGGt
Isso não é necessariamente, mas deve haver coordenação entre #!/bin/she sh script.sh(ou #!/bin/bashe bash script.sh)
Konstantin Morenko
3
A linguagem sh não possui matrizes ( a[index]=xou a=(x y)). Alguns intérpretes sh suportam matrizes, apenas o ksh88 (não portado para o Linux AFAIK) e algumas variantes pdksh mais antigas suportariam a[index]=valuee não a=(x y). No Debian, shgeralmente é dashque não tem suporte a array ( a[index]=xnão funcionará).
Stéphane Chazelas
1
Eu posso morrer em pedaços a partir de agora! :)
Paulo
0

A execução ./scriptname.shresultará na leitura da primeira linha do arquivo e verá que ele precisa executar ´ / bin / bash´ e passar o restante do script para o intérprete, enquanto a execução sh scriptname.shpassará o arquivo para o shell padrão do usuário (por exemplo, Ash) e esse outro intérprete não suporta matrizes como o Bash.

dave_alcarin
fonte
1
shnão é necessariamente o "shell padrão do usuário", é geralmente seu próprio executável (ou link simbólico) e shserá invocado para processar o script. Isso será verdadeiro se mesmo que o shell de login padrão para esse usuário ébash
Eric Renouf
Essa foi a parte em que eu não tinha muita certeza no momento. Obrigado pelo esclarecimento!
Dave_alcarin
0

Com sh scriptname.sh, você está executando sh, não necessariamente com bash. Tente comparar sh --versionnas duas máquinas. E / ou com dpkg -S $(which sh).

joepd
fonte
Mesmo que shseja um link simbólico para bashele, ele se comportará de maneira diferente quando invocado comosh
Eric Renouf