Условные выражения bash: как выразить «и»? (если [! -z $ VAR && -e $ VAR])

187

Думаю, я не понимаю, как это сделать и тесты. Я хотел убедиться, что существует аргумент, который хорошо работает с [ -e $VAR ], но оказывается, что он также оценивается как истинный в пустой строке; которого я не хочу.

Как я и их вместе? Или есть еще один унарный тест, который выполняет то, что я хочу?

Теги:

5 ответов

319
Лучший ответ
if [ ! -z "$var" ] && [ -e "$var" ]; then
      # something ...
fi
  • 8
    Это решение работает даже в строго POSIX-совместимых оболочках и, следовательно, также в bash ; однако, чтобы в полной мере воспользоваться "bashisms", см. ответ @ paxdiablo.
  • 1
    Очень рад видеть это посоветованным вместо устаревшего -a .
Показать ещё 1 комментарий
44

Из bash manpage:

[[ expression ]] - вернуть статус 0 или 1 в зависимости от оценки выражения условного выражения.

И для выражений один из вариантов:

expression1 && expression2 - true, если оба значения expression1 и expression2 верны.

Итак, вы можете and их вместе следующим образом (-n является противоположностью -z, поэтому мы можем избавиться от !):

if [[ -n "$var" && -e "$var" ]] ; then
    echo "'$var' is non-empty and the file exists"
fi

Однако, я не думаю, что это необходимо в этом случае, -e xyzzy является истинным, если файл xyzzy существует и может легко обрабатывать пустые строки. Если это то, что вам нужно, вам действительно не нужна проверка -z не пустой:

pax> VAR=xyzzy
pax> if [[ -e $VAR ]] ; then echo yes ; fi
pax> VAR=/tmp
pax> if [[ -e $VAR ]] ; then echo yes ; fi
yes

Другими словами, просто используйте:

if [[ -e "$var" ]] ; then
    echo "'$var' exists"
fi
  • 0
    Мы можем сократить его с помощью [[ -e "$var" ]] && echo "'$var' exists"
  • 1
    Да, если это однострочник (как мой пример). Я бы не стал этого делать, если бы условный блок был намного сложнее.
4
if [ -n "$var" -a -e "$var" ]; then
    do something ...
fi

 

  • 9
    Поскольку POSIX не определяет поведение [ со сложными наборами тестов, мы должны избегать использования -a или -o с [ . Я читаю это здесь .
  • 2
    @ jaypal-singh Вы правы, но в теме есть тег bash а не упоминание о POSIX, поэтому я выкладываю эту версию, которая работает под bash и некоторыми другими современными оболочками.
Показать ещё 2 комментария
2

Просто укажите свою переменную:

[ -e "$VAR" ]

Это значение [ -e "" ], если $VAR пусто.

Ваша версия не работает, потому что она оценивается как [ -e ]. Теперь в этом случае bash просто проверяет, является ли единственный аргумент (-e) непустой строкой.

Из man-страницы:

test и [оценивать условные выражения, используя набор правил, основанный на количестве аргументов....

1 аргумент

Выражение истинно тогда и только тогда, когда аргумент не равен нулю.

(Кроме того, это решение имеет дополнительное преимущество в работе с именами файлов, содержащих пробелы)

0

Я нашел ответ сейчас, спасибо за ваши предложения!

for e in ./*.cutoff.txt; do
if grep -q -E 'COX1|Cu-oxidase' $e
then
    echo xyz >$e.match.txt
else
    echo
fi

if grep -q -E 'AMO' $e
then
    echo abc >$e.match.txt
else
    echo
fi; done

любые комментарии по этому поводу? Кажется неэффективным grep дважды, но он работает...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню