Я хочу проверить, является ли файл файлом и существует ли он и не является ли он пустым, поэтому в итоге использовали комбинированную проверку с -f
и -s
.Я хочу вернуть сразу, если файл не существует или является пустым, поэтому я отменяю обе проверки.
Чтобы проверить сценарий, в котором мое имя файла вернуло пустую строку, и я передаю путь к каталогу, я пытаюсь это сделать:
if [[ ! -f "/path/to/dir/" ]] && [[ ! -s "/path/to/dir/" ]];
then echo "Does not exists"; else echo "Exists"; fi
Exists
Выше возвращается 'Exist', который кажется неправильным.
-f
только проверка правильна:
if [[ ! -f "/path/to/dir/" ]]; then echo "Does not exists";
else echo "Exists"; fi
Не существует
Комбинированная проверка, но без отрицания каждого, также правильна:
if [[ -f "/path/to/dir/" ]] && [[ -s "/path/to/dir/" ]];
then echo "Exists"; else echo "Does not exists"; fi
Не существует
Не уверен, что я делаю что-то не так или есть какая-то странностьв Bash при объединении отрицательных условий с логическими и &&
?
Правка 1: как и в случае с нотацией, где оба условия находятся в одном наборе скобок:
if [[ ! -f "/opt/gmdemea/smartmap_V2/maps/" && ! -s "/opt/gmdemea/smartmap_V2/maps/" ]]; then echo "Does not exists"; else echo "Exists"; fi
Существует
Но это не меняет поведения.
Редактировать 2: Из справочной страницы кажется, что в этой ситуации -s
должно быть достаточно, но при прохождении существующего пути к каталогу возвращаетсяtrue (версия Bash: 4.1.2 (1) -релиз):
if [[ -s "/opt/gmdemea/smartmap_V2/maps/" ]]; then echo "Exists"; else echo "Does not exists"; fi
Exists
Возвращает «Exists», пока это не файл, поэтому следует обратиться к предложению else, возвращающему «Not существует»