Странность с bash не оператором - PullRequest
3 голосов
/ 28 сентября 2010

Я пытаюсь определить, не существует ли файл или каталог. Я попробовал следующие команды, чтобы проверить, существует ли файл и работает ли он правильно:

if [ -a 'settings.py' ]; then echo 'exists'; fi
exists #output
if [ -a 'foo' ]; then echo 'exists'; fi #outputs nothing

Но когда я попробую это:

if [ ! -a 'settings.py' ]; then echo 'does not exist'; fi
does not exist #shouldn't be output since the file does exist
if [ ! -a 'foo' ]; then echo 'does not exist'; fi
does not exist

«не существует» выводится независимо от того, что.

Ответы [ 3 ]

2 голосов
/ 28 сентября 2010

У меня раньше были проблемы с командой [. Я предпочитаю вариант [[, так как он гораздо более мощный и, по моему опыту, менее склонен к подобным "хитам".

Если вы используете команду [[, ваши тестовые команды работают нормально:

pax> touch qq
pax> if [[ -a qq ]] ; then echo exists ; fi
exists
pax> if [[ ! -a qq ]] ; then echo not exists ; fi
pax> rm qq
pax> if [[ ! -a qq ]] ; then echo not exists ; fi
not exists
1 голос
/ 28 сентября 2010

Попробуйте использовать -e вместо -a

На этой странице Проекта документации Linux написано:

-a фактически идентичен -e. Но он устарел, и его использование не рекомендуется.

0 голосов
/ 28 сентября 2010

вы можете использовать test

test -e "$file" && echo "exists"
...