`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?


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.


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.


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).


Mesmo que shseja um link simbólico para bashele, ele se comportará de maneira diferente quando invocado comosh
Eric Renouf
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.