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