Você precisa dividir o comando test (e citar suas expansões se estiver usando um shell compatível com POSIX):
[ "$d" -gt 0 ] && [ "${a[d-1]}" -gt "${a[d]}" ]
Eu escrevi um programa em shell script unix para classificar uma matriz de inteiros. Mas estou recebendo um erro na linha 11, A linha é,
while [ $d -gt 0 && ${a[$(d-1)]} -gt ${a[$d]} ]
O erro é como insertionsort.sh: line 11: [: missing ] ''. O que estou fazendo de errado?
Você precisa dividir o comando test (e citar suas expansões se estiver usando um shell compatível com POSIX):
[ "$d" -gt 0 ] && [ "${a[d-1]}" -gt "${a[d]}" ]
Como essa é a sintaxe do ksh (também suportada por bash e zsh -o ksharrays ) por causa dos arrays cujos índices começam em 0 (em oposição a 1 em todos os outros shells), é melhor usar o ksh ((...)) operador de avaliação aritmética aqui:
while ((d > 0 && a[d-1] > a[d]))
(outros já explicaram os problemas em seu código).
Note que o zsh tem suporte embutido para ordenar matrizes de números inteiros decimais numericamente:
$ a=(10 6 2)
$ echo ${(n)a}
2 6 10
O ksh pode ordenar matrizes, mas apenas lexicamente AFAIK:
$ a=(10 2 6)
$ set -sA b -- "${a[@]}"
$ echo "${b[@]}"
10 2 6
Existem dois erros no código:
Ao usar [ ... ] para testes, separe os testes em vários [ ... ] com operadores lógicos intermediários:
while [ expression ] && [ expression ]; do
Você pode usar sua maneira de construir o teste se estiver usando bash e seu [[ ... ]] :
while [[ expression && expression ]]; do
... mas provavelmente ainda será mais legível se for dividido em
while [[ expression ]] && [[ expression ]]; do
pelo menos por mais ou mais expressões. Para o teste somente aritmético, você pode usar (( ... )) em bash e outras shells compatíveis; %código%. Em (( arithmetic expression )) && (( arithmetic expression )) você também deve usar (( ... )) , < etc. no lugar de > , -lt etc.
Supondo que você esteja usando -gt arrays, o índice na matriz é avaliado em um contexto aritmético. Isso significa que bash pode ser escrito ${a[$d]} . Mais importante, ${a[d]} é provavelmente um erro, pois tentaria executar um comando chamado ${a[$(d-1)]} . Isso provavelmente deve ser d-1 .
Tags shell