Operadores de comparación y expresión de bash

11

Soy nuevo en la programación bash. He leído dos guías buenas y largas, pero hicieron un desastre en mi cabeza sobre operadores y palabras clave.

¿Cuáles son más comunes y ampliamente utilizados? No sé cuándo usar qué y por qué.

  1. test, [[ ]]O [ ]incluso(( ))
  2. $((exp)) o $[exp]
  3. -gto >, geo >=etc.
  4. cuándo usar <y / >o ( )cuando tenemos que escapar con \: \< \(etc.
  5. ==o =(comparaciones de cadenas)

Sé que las diferencias básicas entre [y [[otras preguntas son un misterio para mí.

Gracias de antemano

MikeD
fuente
2
Un wiki muy útil que está actualizado y menciona muchas buenas prácticas es el wiki de Greg . La guía Bash y las preguntas frecuentes sobre allí son particularmente útiles.

Respuestas:

5
  • testes un shell incorporado que (obviamente) prueba alguna condición dada. Algunos proyectiles más viejos necesitan un comando especial. Así que también encontrarás un programa en /usr/bin/test.
  • [También es un programa para probar alguna condición. Este software también necesita un soporte de cierre y puede encontrarlo en /usr/bin/[.
  • [[…]]es una alternativa a testy [. Fue desarrollado para el shell Korn ( ksh). Pero también lo encuentra en las versiones Bash mayores de 2 y en el Z Shell. Los corchetes dobles tienen algunas características ingeniosas:
    • El shell no divide palabras ni expande nombres de archivos.
    • No necesitas citas.
    • En lugar de -a(AND) u -o(OR) puede usar &&o ||.
    • El =puede hacer mucho más.
  • ((…))es equivalente a let. Entonces básicamente ((expression))es lo mismo que let "expression". Sin embargo, con letusted puede usar más de una expresión, pero las llaves dobles solo permiten una expresión.
  • $((…))(y también $[…]) hace algunos cálculos. Tu shell intenta calcular la expresión dentro de las llaves y reemplaza la expresión con el resultado. Así echo $((1+1))lleva a echo 2. Entonces tus conchas imprimen el número 2.

Cada vez que desee comparar dos números, debe usar la opción con un guión y dos letras ( -ge, -ltetc.). Si desea comparar cadenas, debe usar =o !=.

Su pregunta sobre escapar es bastante difícil de responder. Porque depende del software que uses además del shell. Es decir, grepy grep -Enecesita escapar diferente. Este es también el caso con sed, awky otros. Entonces, la mejor opción es echar un vistazo a la página de manual. Después de un tiempo te acostumbras y sabes cuándo usar el escape.

qbi
fuente
gracias. una pregunta más, porque es posible hacer una comparación usando ((...)), ¿es más común usar esta versión: if ((2> 1)) O esto: if [[2 -gt 1]]
MikeD
Supongo que if [ 2 -gt 1 ]; …es más común, porque lo veo más a menudo en los scripts de shell y, hasta donde sé, es compatible con POSIX.
qbi
Otra cosa a tener en cuenta es que [expresión] es verdadera si la expresión se evalúa como / devuelve cero, pero ((expresión)) es verdadera si la expresión se evalúa como / devuelve distinto de cero.
Joe