Si desea expresar la siguiente prueba en shell (sh):
if ( a == 1 && ( b == 1 || b == 2 )) { ... }
Hasta ahora, lo mejor que he podido escribir es esto:
if [[ $a -eq 1 ]]; then
if [[ $b -eq 1 || $b -eq 2 ]]; then
...
fi
fi
No sé cómo componer && y || con precedencia correcta Buscar en Google no me ha dado ninguna respuesta (los tutoriales solo dan ejemplos básicos, si los hay)
¿Cuál es la sintaxis para combinar esos dos si en uno?
ksh
? Entonces su código inicial requeriría solo un par de paréntesis más:if (( a == 1 && ( b == 1 || b == 2 ))); then :; fi
Respuestas:
Tenga en cuenta que
[[ ]]
no está ni en Bourne ni en POSIXsh
. Para unash
sintaxis verdadera , hay varias formas de hacerlo.Usando solo un
[ ]
paro Evitar el POSIX
-a
y las-o
opciones 11 Una razón para evitar
-a
y-o
es la máxima portabilidad: no todastest
o las[
implementaciones pueden manejar más de 4 argumentos, que es precisamente lo que obtienes si encadenas expresiones con-a
y-o
y\( \)
.fuente
/bin/sh
, es incorrecto escribir la secuencia de comandos utilizando características que no están ensh
. Debes saber queksh
NO essh
, sino un superconjunto desh
. Si lleva su scriptksh
-but-declarado-como-sh
a un sistema dondesh
no hay un enlace simbólicoksh
, puede romperse. Puede evitar ese problema asegurándose de que su script coincida con la declaración./bin/sh
se invocará un shebang de/bin/sh
. El problema es/bin/sh
no acepta[[
. No puede usar[[
o usar un shell que acepte[[
, por ejemploksh
, como su shebang.-a
/-o
no son admitidos por algunas implementaciones, pero que no es confiable para los argumentos arbitrarios. Like[ "$a" = "$b" -o "$b" = "$c" ]
fallaría para valores de$a
like!
con muchas[
implementaciones.Probé un poco de sintaxis y descubrí que
está trabajando.
fuente
Otro enfoque POSIX:
fuente
La forma correcta de hacerlo con un mero
shell
:Explicación:
test
aquí sirve como paréntesis y-o
como lógico o. Si fuera lógico y dentro del "paréntesis" lo usaría-a
.Más sobre eso se puede encontrar aquí
fuente