sirve scripts script resueltos que programas pasar parametros para operaciones manejo ejercicios ejemplos cadenas aritmeticas bash

resueltos - scripts bash ejemplos



¿Cuál es la diferencia entre[y[[en Bash? (4)

Miré la página de manual de bash y el [[ dice que usa expresiones condicionales. Luego miré la sección Expresiones condicionales y enumera los mismos operadores que test (y [ ).

Así que me pregunto, ¿cuál es la diferencia entre [ y [[ en Bash?


En bash, a diferencia de [ , [[ evita la división de palabras de valores variables].


La diferencia más importante será la claridad de su código. Sí, sí, lo que se ha dicho anteriormente es cierto, pero [[]] alinea su código con lo que usted esperaría en lenguajes de alto nivel, especialmente en lo que respecta a AND ( && ), OR ( || ) y NOT ( ! ) operadores. Por lo tanto, cuando te muevas entre sistemas e idiomas podrás interpretar el script más rápido, lo que hace tu vida más fácil. Obtenga el detalle esencial de una buena referencia de UNIX / Linux. Es posible que algunos de los detalles esenciales sean útiles en ciertas circunstancias, ¡pero siempre apreciará el código claro ! ¿Qué fragmento de guión preferirías leer? Incluso fuera de contexto, la primera opción es más fácil de leer y entender.

if [[ -d $newDir && -n $(echo $newDir | grep "^${webRootParent}") && -n $(echo $newDir | grep ''/$'') ]] then ...

o

if [ -d "$newDir" -a -n $(echo "$newDir" | grep "^${webRootParent}") -a -n $(echo "$newDir" | grep ''/$'') ] then ...


[[ es la mejora de bash al [ comando. Tiene varias mejoras que lo convierten en una mejor opción si escribe scripts que se dirigen a bash. Mis favoritos son:

  1. Es una característica sintáctica del shell, por lo que tiene un comportamiento especial que [ no tiene]. Ya no tiene que citar variables como enojado porque [[ maneja cadenas vacías y cadenas con espacios en blanco de manera más intuitiva. Por ejemplo, con [ tienes que escribir

    if [ -f "$file" ]

    para manejar correctamente cadenas vacías o nombres de archivos con espacios en ellas. Con [[ las citas son innecesarias:

    if [[ -f $file ]]

  2. Debido a que es una característica sintáctica, le permite usar && y || operadores para pruebas booleanas y < y > para comparaciones de cadenas. [ no puede hacer esto porque es un comando regular y && , || , < y > no se pasan a los comandos regulares como argumentos de línea de comandos.

  3. Tiene un operador maravilloso =~ para hacer coincidencias de expresiones regulares. Con [ podrías escribir

    if [ "$answer" = y -o "$answer" = yes ]

    Con [[ puedes escribir esto como

    if [[ $answer =~ ^y(es)?$ ]]

    Incluso le permite acceder a los grupos capturados que almacena en BASH_REMATCH . Por ejemplo, ${BASH_REMATCH[1]} sería "es" si escribiera un "sí" completo arriba.

  4. Obtienes la coincidencia de patrones aka globbing gratis. Tal vez eres menos estricto sobre cómo escribir sí. Quizás estés bien si el usuario escribe y-cualquier cosa. Te tengo cubierto

    if [[ $ANSWER = y* ]]

Tenga en cuenta que es una extensión de bash, por lo que si está escribiendo scripts compatibles con sh, entonces debe seguir con [ . Asegúrese de tener la línea #!/bin/bash shebang para su script si usa corchetes dobles.

Ver también


  • [ es lo mismo que la test incorporada, y funciona como el binario de test (prueba de hombre)
    • funciona de la misma forma que [ en todos los demás shells basados ​​en sh en muchos entornos similares a UNIX
    • Solo soporta una sola condición. Pruebas múltiples con el bash && y || Los operadores deben estar entre paréntesis separados.
    • no soporta de forma nativa un operador ''no''. Para invertir una condición, use un ! fuera del primer corchete para usar la facilidad del shell para invertir los valores de retorno de comando.
    • == y != son comparaciones de cadenas literales
  • [[ es una fiesta
    • es específico de bash, aunque otros shells pueden haber implementado construcciones similares. No lo esperes en un antiguo UNIX sh.
    • == y != aplique las reglas de coincidencia de patrones de bash, consulte "Coincidencia de patrones" en man bash
    • tiene un operador de concordancia =~ regex
    • Permite el uso de paréntesis y el ! , && , y || Operadores lógicos entre paréntesis para combinar subexpresiones.

Aparte de eso, son bastante similares: la mayoría de las pruebas individuales funcionan de forma idéntica entre ellas, las cosas solo se ponen interesantes cuando se necesitan combinar diferentes pruebas con operaciones lógicas AND / OR / NOT.