Como escrever uma instrução if com várias condições

0
for filename in *
do
    if [ "$filename" -ne even ] && [ "$filename" -ne odd ]
    then
        echo "$filename"
    fi
done

Acima está um script de shell simples que verifica os arquivos no repositório atual e gera o arquivo cujos nomes não são "par" e "ímpares"

Não funciona

    
por Tinler 26.02.2018 / 01:04

3 respostas

2

Altere a linha if para:

if [ "$filename" != even ] && [ "$filename" != odd ]

No shell bash , todo o script, ( isto é, o for , etc. ), pode ser simplificado para:

GLOBIGNORE=even:odd ; printf "%s\n" *

Outro método bash :

shopt -s extglob  # only needs to be done once, if not set already.
printf "%s\n" !(odd|even)
    
por 26.02.2018 / 02:09
2

O operador de comparação -ne é um operador aritmético , ou seja, compara apenas inteiros:

i=7

if [ "$i" -ne 6 ] && [ "$i" -ne 8 ]; then
   echo 'i is neither 6 nor 8'
fi

Para comparar strings por desigualdade, use != :

if [ "$filename" != 'even' ] && [ "$filename" != 'odd' ]; then
    printf '%s\n' "$filename"
fi

Ou usando case :

case "$filename" in
    even|odd) ;;
           *) printf '%s\n' "$filename"
esac

Observe também que * corresponderá a qualquer nome no diretório atual, não apenas a nomes de arquivos regulares. Para ter certeza de que você processa apenas arquivos regulares em seu loop, use

for name in *; do
    test -f "$name" || continue

    # other code here using "$name"
done

test -f "$name" pode ser substituído por

if [ ! -f "$name" ]; then
    continue
fi

ou apenas

[ ! -f "$name" ] && continue

ou

[ -f "$name" ] || continue

A instrução continue pula para a próxima iteração do loop.

    
por 26.02.2018 / 07:51
0

Ou um par de colchetes com -a

for filename in *
do
     if [ "$filename" != even -a "$filename" != "odd" ]
     then
         echo "$filename"
     fi
done

ou

for filename in * 
do 
    case "$filename" in  
        (even|odd) ;; 
            *) echo "$filename" ;; 
    esac
done
    
por 26.02.2018 / 03:50

Tags