Clone
1
SC2332
Vidar Holen edited this page 2025-04-08 11:13:35 -07:00

[ ! -o opt ] is always true because -o becomes logical OR. Use or ! [ -o opt ].

Or "[ ! -a file ] is always true because -a becomes logical AND. Use -e instead."

Problematic code:

if [ ! -o braceexpand ]
then 
  ..
fi

Correct code:

if [[ ! -o braceexpand ]]
then 
  ..
fi

or

if ! [ -o braceexpand ]
then 
  ..
fi

Rationale:

Bash interprets [ ! -o opt ] as [ "!" ] || [ "opt" ] instead of negating the condition. As a result, the condition is always true.

Avoid this by using [[ ! -o opt ]] or ! [ -o opt ].

The same issue applies to [ ! -a file ], but this is easier fixed using POSIX standard [ ! -e file ].

Exceptions:

None.

  • Help by adding links to BashFAQ, StackOverflow, man pages, POSIX, etc!