Em primeiro lugar, observe que nenhum dos tipos de colchetes faz parte da sintaxe %código%. Em vez disso:
-
if
é outro nome para o shell embutido[
; -
test
é um built-in separado, com sintaxe e semântica diferente.
Aqui estão trechos da documentação do bash:
[[ ... ]]
/ [
test: test [expr]
Evaluate conditional expression.
Exits with a status of 0 (true) or 1 (false) depending on
the evaluation of EXPR. Expressions may be unary or binary. Unary
expressions are often used to examine the status of a file. There
are string operators and numeric comparison operators as well.
The behavior of test depends on the number of arguments. Read the
bash manual page for the complete specification.
File operators:
-a FILE True if file exists.
(...)
test
[[ ... ]]: [[ expression ]]
Execute conditional command.
Returns a status of 0 or 1 depending on the evaluation of the conditional
expression EXPRESSION. Expressions are composed of the same primaries used
by the 'test' builtin, and may be combined using the following operators:
( EXPRESSION ) Returns the value of EXPRESSION
! EXPRESSION True if EXPRESSION is false; else false
EXPR1 && EXPR2 True if both EXPR1 and EXPR2 are true; else false
EXPR1 || EXPR2 True if either EXPR1 or EXPR2 is true; else false
When the '==' and '!=' operators are used, the string to the right of
the operator is used as a pattern and pattern matching is performed.
When the '=~' operator is used, the string to the right of the operator
is matched as a regular expression.
The && and || operators do not evaluate EXPR2 if EXPR1 is sufficient to
determine the expression's value.
Exit Status:
0 or 1 depending on value of EXPRESSION.
Mais simplesmente dito, [[ ... ]]
requer que se tome o cuidado normal necessário para
expressões bash, citar para evitar a interpolação, etc.
de testar se [
é a string vazia ou se não está definida, seria:
[ -z "$foo" ]
ou
[[ -z $foo ]]
É importante citar no primeiro caso, porque a configuração $foo
e, em seguida, testar foo="a b"
resultaria em [ -z $foo ]
recebendo dois
argumentos, o que é incorreto.
O idioma para test -z
é diferente e sabe bem sobre
variáveis, muito do modo que se esperaria de um nível mais alto
linguagem do que bash. Por esta razão, é muito menos propenso a erros do que
clássico [[ .. ]]
/ [
.