O motivo para preferir [
over [[
, se suficiente, é que [
é mais estável entre as diferentes versões bash.
Veja man bash
:
compat31
If set, bash changes its behavior to that of version 3.1 with respect to quoted arguments to the [[ conditional command's =~ operator.
compat32
If set, bash changes its behavior to that of version 3.2 with respect to locale-specific string comparison when using the [[ conditional command's < and > operators. Bash versions prior to bash-4.1 use ASCII collation and strcmp(3); bash-4.1 and later use the current locale's collation sequence and strcoll(3).
compat40
If set, bash changes its behavior to that of version 4.0 with respect to locale-specific string comparison when using the [[ conditional command's < and > operators (see previous item) and the effect of interrupting a command list.
Talvez seja também um pouco mais comum para usuários com ksh
background.
Nota sobre o desempenho
'[[' é mais rápido como '['
- Para uma invocação singular, a diferença de velocidade tem sem impacto comensurável e você deve preferir o '[' builtin.
- Se você estiver dentro de uma construção de loop maior, você pode pensar em replace '[' with '[['
Para uma medição, você pode usar o seguinte script de comparação
let upperBound=$1
echo "check [, ${upperBound} iterations"
let i=0
time while [ $i -lt ${upperBound} ] ; do let i++ ; done
echo; echo;
echo "check [[, ${upperBound} iterations"
let i=0
time while [[ $i < ${upperBound} ]] ; do let i++ ; done
Resultado do script de comparação
check [, 1000 iterations
real 0m0.031s
user 0m0.028s
sys 0m0.004scheck [[, 1000 iterations
real 0m0.000s
user 0m0.000s
sys 0m0.000s