várias condicionais no shell script

2

Isso está me deixando louco. Há muitos posts sobre isso, mas nada está funcionando para mim. Eu quero verificar se um arquivo não é um avi ou mpg, então eu quero sair. Aqui está um exemplo simples:

#!/bin/sh

extension="avi"
if [ $extension != "avi" ] || [ $extension != "mpg" ]; then
        echo "ERROR: File is not an avi or mpg"
        exit 1
fi
echo "I should print out"

Isso sempre retorna a mensagem ERROR que não deveria. Eu também tentei:

if [[ $extension != "avi" ]] || [[ $extension != "mpg" ]]; then
if ([[ $extension != "avi" ]] || [[ $extension != "mpg" ]]); then
if [ $extension != "avi" -o $extension != "mpg" ]; then

O que estou perdendo?

    
por Tom 09.04.2013 / 20:57

2 respostas

3

Você cometeu um erro em sua lógica. Ambas as condições devem ser preenchidas não apenas uma, de modo que você precisa do operador AND (& &) em vez do OR (||). Experimente:

if [ $extension != "avi" ] && [ $extension != "mpg" ]; then

ou mais elegante:

if [ $extension != "avi" -a $extension != "mpg" ]; then
    
por 09.04.2013 / 21:04
2

case declarações são projetadas exatamente para esse tipo de situação. Com o exemplo dado, algo assim:

#!/bin/sh

extension="avi"
case "$extension" in
  avi | mpg )
    echo "I should print out"
    ;;
  * )
    echo "ERROR: File is not an avi or mpg"
    exit 1
    ;;
esac

Isso tem as vantagens óbvias de ser mais fácil expandir e ler.

    
por 09.04.2013 / 21:19