El problema aquí es que [
es un simple comando buildtin en bash (otra manera de escribir test
), que sólo puede interpretar lo que los parámetros se pone, mientras (
es un personaje del operador. El análisis de operadores viene antes de la ejecución del comando.
Para utilizar (
y )
con [
, hay que citarlos:
if [ \(! true \) -o true ]
then
echo "Success!"
else
echo "Fail!"
fi
o
if [ '(' ! true ')' -o true ]
then
echo "Success!"
else
echo "Fail!"
fi
El [[ ... ]]
construcción es una construcción sintáctica especial que no tiene las limitaciones sintácticas de costumbre comandos, ya que funciona en otro nivel. Por lo tanto, aquí no necesita citar sus paréntesis, como dijo Ignacio. (Además, debe utilizar &&
y ||
en lugar de -a
y -o
aquí)