Думаю, я не понимаю, как это сделать и тесты. Я хотел убедиться, что существует аргумент, который хорошо работает с [ -e $VAR ]
, но оказывается, что он также оценивается как истинный в пустой строке; которого я не хочу.
Как я и их вместе? Или есть еще один унарный тест, который выполняет то, что я хочу?
if [ ! -z "$var" ] && [ -e "$var" ]; then
# something ...
fi
Из 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
[[ -e "$var" ]] && echo "'$var' exists"
if [ -n "$var" -a -e "$var" ]; then
do something ...
fi
POSIX
не определяет поведение [
со сложными наборами тестов, мы должны избегать использования -a
или -o
с [
. Я читаю это здесь .
bash
а не упоминание о POSIX, поэтому я выкладываю эту версию, которая работает под bash
и некоторыми другими современными оболочками.
Просто укажите свою переменную:
[ -e "$VAR" ]
Это значение [ -e "" ]
, если $VAR
пусто.
Ваша версия не работает, потому что она оценивается как [ -e ]
. Теперь в этом случае bash просто проверяет, является ли единственный аргумент (-e
) непустой строкой.
Из man-страницы:
test и [оценивать условные выражения, используя набор правил, основанный на количестве аргументов....
1 аргумент
Выражение истинно тогда и только тогда, когда аргумент не равен нулю.
(Кроме того, это решение имеет дополнительное преимущество в работе с именами файлов, содержащих пробелы)
Я нашел ответ сейчас, спасибо за ваши предложения!
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 дважды, но он работает...
bash
; однако, чтобы в полной мере воспользоваться "bashisms", см. ответ @ paxdiablo.-a
.