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?
bash
shell-script
array
IGGt
fonte
fonte
cat -v <script>
ver se há caracteres espúrios.sh
não ébash
e assim por executá-lo comosh scriptname.sh
está erradoRespostas:
Quando você o usa
./scriptname.sh
, executa com/bin/bash
como na primeira linha com#!
. Mas quando você usash scriptname.sh
ele executash
, nãobash
.O
sh
shell não tem sintaxe para criar matrizes, mas o Bash tem a sintaxe que você usou.fonte
./
agora. aplausos#!/bin/sh
esh script.sh
(ou#!/bin/bash
ebash script.sh
)a[index]=x
oua=(x y)
). Alguns intérpretes sh suportam matrizes, apenas o ksh88 (não portado para o Linux AFAIK) e algumas variantes pdksh mais antigas suportariama[index]=value
e nãoa=(x y)
. No Debian,sh
geralmente édash
que não tem suporte a array (a[index]=x
não funcionará).A execução
./scriptname.sh
resultará 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çãosh scriptname.sh
passará 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.fonte
sh
não é necessariamente o "shell padrão do usuário", é geralmente seu próprio executável (ou link simbólico) esh
será invocado para processar o script. Isso será verdadeiro se mesmo que o shell de login padrão para esse usuário ébash
Com
sh scriptname.sh
, você está executandosh
, não necessariamente combash
. Tente compararsh --version
nas duas máquinas. E / ou comdpkg -S $(which sh)
.fonte
sh
seja um link simbólico parabash
ele, ele se comportará de maneira diferente quando invocado comosh