Erro no loop while

0

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?

    
por Souvik Das 28.03.2018 / 07:26

3 respostas

2

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]}" ]
    
por 28.03.2018 / 07:48
1

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
    
por 28.03.2018 / 08:16
1

Existem dois erros no código:

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

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

por 28.03.2018 / 08:02

Tags