/ / ¿Por qué la prueba dice paréntesis inesperado? - bash, shell, sh

¿Por qué la prueba dice paréntesis inesperado? - bash, shell, sh

Yo tengo un if línea en mi script de shell que se ve así:

if [ 0 -lt 2 -o (0 -gt 3 ) ]

y esto da el error:

line 3: syntax error near unexpected token `("

Así que miré man test para estar seguros de que los parens fueron apoyados, y de hecho, muy cerca de la parte superior de la página de manual, ¡lo son! ¿¡Lo que da!?

El ejemplo anterior no coincide exactamente con el código porque estaba intentando limpiarlo para demostrar un punto, pero esto es mi repo si necesitabas contexto

EDITAR: cambió la línea if para que coincida con el error.

Respuestas

5 para la respuesta № 1

Los paréntesis se pasan a la test mando como argumentos. los [ ... ] expresión es sólo otra forma de escribir el test mando. La única diferencia es que el último argumento para el [ el comando debe ser ].

Por lo tanto, debe evitar los paréntesis como cualquier otro argumento que pase a un comando para evitar la interpretación de shell:

if [ ( $# -lt 2 ) -o ( $# -gt 3 ) ]

Alternativamente, use comillas simples:

if [ "(" $# -lt 2 ")" -o "(" $# -gt 3 ")" ]

Desde la página de información:

`test"
`["
test EXPR

Evaluate a conditional express ion EXPR and return a status of 0
(true) or 1 (false).  Each operator and operand must be a separate
argument.

Por cierto, la expresión podría reescribirse como sigue:

if builtin test ( $# -lt 2 ) -o ( $# -gt 3 )

3 para la respuesta № 2

Tienes innecesario (...) dentro [ ... ] que no se han salvado ni se han citado, lo que provoca un error de sintaxis.

Puedes usar esto en su lugar:

[[ $# -lt 2 || $# -gt 3 ]]

O bien use:

[[ $# -lt 2 ]] || [[ $# -gt 3 ]]

3 para la respuesta № 3

Aunque esta solución no responde directamente a la pregunta, aquí hay una forma alternativa que usa el estilo C expresiones aritméticas, que es efectivo si estás tratando con números en bash

#!/bin/bash

if (( "$#" < 2 || "$#" > 3 )); then