nunca use el operador `-a` o` -o` con `[`

11

Stéphane Chazelas escribió:

algunas reglas como

  • siempre cotizar variables
  • nunca use el operador -ao -o(use varios [comandos y los operadores &&y ||shell)

Haga [confiable con los proyectiles POSIX.

¿Por qué "nunca usar el operador -ao -o"?

¿Cómo puedo hacer "usar varios [comandos y los operadores &&y ||shell)"?

Tim
fuente

Respuestas:

13

¿Por qué "nunca usar el operador -ao -o"?

Porque pueden ser ambiguos y, por lo tanto, no son compatibles con POSIX :

Las extensiones XSI que especifican los primarios binarios -a y -o y los operadores '(' y ')' se han marcado como obsoletos. (Muchas de las expresiones que las usan están definidas ambiguamente por la gramática dependiendo de las expresiones específicas que se evalúan). Las secuencias de comandos que usan estas expresiones deben convertirse a las formas que se dan a continuación. Aunque muchas implementaciones continuarán admitiendo estas formas obsoletas, las secuencias de comandos deben ser extremadamente cuidadosas cuando se trata de entradas proporcionadas por el usuario que podrían confundirse con estas y otras primarias y operadores. A menos que el desarrollador de la aplicación conozca todos los casos que producen información para el script, las invocaciones como:

test "$1" -a "$2"

debe escribirse como:

test "$1" && test "$2"

¿Cómo puedo hacer "usar varios [comandos y los operadores &&y ||shell)"?

Al hacer múltiples pruebas y encadenarlas usando dichos operadores; por ejemplo:

[ 0 -eq 0 -a \( 0 -eq 1 -o 1 -eq 1 \) ]

podría reescribirse como el equivalente:

[ 0 -eq 0 ] && ([ 0 -eq 1 ] || [ 1 -eq 1 ])

o mejor:

[ 0 -eq 0 ] && { [ 0 -eq 1 ] || [ 1 -eq 1 ]; }
kos
fuente
Gracias. (1) "los operadores '(' y ')' se han marcado como obsoletos". ¿Son (y )los operadores que agrupan comandos? Si son obsoletos, ¿cuáles son sus reemplazos? (2) ¿Debe test "$1" -a "$2"ser reemplazado por test "$1" && test "$2"o por ((test "$1" && test "$2"))? ¿No necesitamos el ((..))?
Tim
@Tim Vea la actualización. (1) Sí, puede usar ()y {}como reemplazo. (2) El primero; (())se utiliza para la expansión aritmética, aquí desea probar el estado de salida de la cadena de pruebas, por lo tanto, agrupe las pruebas en una subshell ()o en la shell actual {}.
kos
Gracias. Creo que mis preguntas pueden ir más allá de esta publicación. Así que los publico en una nueva publicación.
Tim
1
@Tim La única razón para usar los operadores (y )es cuando estás usando -ao -o. Como los últimos son obsoletos, los primeros obviamente ya no son necesarios.
Barmar