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 № 1Los 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