Comparação de strings falhando no bash [duplicado]

4

Estou tentando percorrer um array de strings e fazer algo um pouco diferente com um dos valores. A comparação de string falha em todos os elementos.

arr[0]='red'
arr[1]='blue'
arr[2]='yellow'
arr[3]='green'

## now loop through the above array
for i in "${arr[@]}"
do
        if [ "$i"="green" ];
        then
                echo "i('$i') is equal to green"
        else
                echo "i('$i') is not equal to green"
        fi

done

Eu também tentei (com o mesmo resultado):

if [ "$i"='green' ];

e

if [ $i='green' ];

e

if [ $i="green" ];

Resultado de cada um dos itens acima:

i('red') is equal to green
i('blue') is equal to green
i('yellow') is equal to green
i('green') is equal to green

O que estou fazendo de errado com a comparação?

    
por a coder 30.09.2015 / 22:02

4 respostas

12

Espaço em branco ausente

[ $i="green" ] significa [ -n $i=green ]

você precisa

[ "$i" = green ]

ou até mesmo

[ green = "$i" ]

que funciona mesmo para i=-n .

Se você não precisa de portabilidade para outros shells, você pode usar colchetes duplos no bash.

[[ $i = green ]]

As citações não são necessárias (na verdade, no lado direito elas têm um significado especial - elas impedem a expansão). Você também pode usar == em vez de = .

    
por 30.09.2015 / 22:06
5

Você precisa de espaço ao redor do operador de comparação = :

if [ "$i" = "green" ];
    
por 30.09.2015 / 22:05
3

O motivo pelo qual você precisa de espaços ao redor do = é que os comandos [ e test fazem coisas diferentes dependendo de quantos argumentos você passa. Quando você passa apenas um único argumento ( [ "$i"=green ] ), o resultado é verdadeiro se a string não estiver vazia.

Seu código e sua saída não correspondem: dado o código que você postou, todas as cores devem resultar em i('colour') is equal to green

    
por 30.09.2015 / 22:44
2
[ green = "$i" ]
printf "( '%s' ) is %.$?0sequal to green.\n" "$i" "not "

... também funcionaria.

    
por 01.10.2015 / 03:51

Tags