Oleg Verych dixit: >02-08-2007, Peter Samuelson:
>> unset foo >> [ -n $foo ] && echo foo is non-empty >> [[ -n $foo ]] && echo foo is non-empty >> >> As you can see, only the second one works. True, that's why the Korn shell invented [[. >Not quoting possible empty argument is a script writing bug. This is actually wrong; in some cases, additional quoting is a bug (think of “backticks”, which you shouldn't use anyway, but I don't have a better example right now, except for the operators to [[ which must be unquoted) or at least undesi- rable (the argument to “case”, for example), and [[ was spe- cifically designed to NOT expand its arguments as if they were arguments to an external programme. [[ expression ]] Similar to the test and [ ... ] commands (described later), with the following exceptions: + o Field splitting and file name generation are not per- formed on arguments. + o The -a (AND) and -o (OR) operators are replaced with '&&' and '||', respectively. + o Operators (e.g. '-f', '=', '!') must be unquoted. + o The second operand of the '!=' and '=' expressions are patterns (e.g. the comparison [[ foobar = f*r ]] succeeds). + o The single argument form of test, which tests if the argument has a non-zero length, is not valid; explicit operators must always be used e.g. instead of [ str ] use [[ -n str ]]. + o Parameter, command, and arithmetic substitutions are performed as expressions are evaluated and lazy expres- sion evaluation is used for the '&&' and '||' opera- tors. This means that in the following statement, $(<foo) is evaluated if and only if the file foo exists and is readable: $ [[ -r foo && $(<foo) = b*r ]] bye, //mirabile -- I believe no one can invent an algorithm. One just happens to hit upon it when God enlightens him. Or only God invents algorithms, we merely copy them. If you don't believe in God, just consider God as Nature if you won't deny existence. -- Coywolf Qi Hunt