2

Это сводит меня с ума. Есть много сообщений на эту тему, но ничего не работает для меня. Я хочу проверить, если файл не AVI или MPG, то я хочу выйти. Вот простой пример:

#!/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"

Это всегда возвращает сообщение об ошибке, чего не должно быть. Я также попробовал:

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

Что мне не хватает?

2 ответа2

3

Вы ошиблись в своей логике. Оба условия должны быть выполнены не одно, поэтому вам нужно использовать оператор AND (&&) вместо OR (||). Пытаться:

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

или более элегантно:

if [ $extension != "avi" -a $extension != "mpg" ]; then
2

операторы case предназначены именно для такой ситуации. С приведенным примером, что-то вроде этого:

#!/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

В этом есть очевидные преимущества, заключающиеся в том, что их легче как расширять, так и читать.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .