Programación de aprendizaje: ¿Cuál es la diferencia entre [y [[en Bash?


Respuesta 1:

Voy a contarte un par de secretos. First bash es un trabajo derivado. Sus características básicas están inspiradas en el shell Bourne de Stephen Bourne. La intención original del "Bourne again shell" (bash) era volver a implementar un conjunto de características y una sintaxis compatibles, como software libre FSF GNU. Además, el comando [o test no era una característica integrada del shell Bourne original. Un equivalente de GNU del comando externo / bin / test, y su [enlace todavía está instalado en Linux como parte de los coreutils de GNU

En las versiones modernas de bash, el comando de prueba y su [alias, están incorporados. Emulan MÁS SENCILLAMENTE la semántica del comando externo. Al igual que cualquier comando incorporado de bash, puede deshabilitarlo y habilitarlo según sea necesario, o incluso por capricho.

Aquí es donde [[entra. Es un comando de prueba integrado mejorado (sintaxis). Puede leer las páginas de manual para obtener más detalles, pero son algo sutiles.

Por ejemplo, sé que [[admite la coincidencia de expresiones regulares. No recuerdo cuándo se agregó eso, tal vez tan pronto como bash4. No creo que la prueba incorporada, ni la versión externa, admitan esa comparación (tendría que usar grep en una sustitución de comando y verificar lo que pasó por el filtro, por ejemplo).

Conclusión: muchas peculiaridades y características de bash solo tienen sentido cuando se ven en el contexto histórico de cómo se escribió y mejoró bash durante mucho tiempo. El shell Bourne original se escribió hace casi cincuenta años.


Respuesta 2:

En la práctica, no hay mucha diferencia entre la codificación [] (corchetes simples) y [[]] (corchetes dobles) en expresiones condicionales en bash. (Por supuesto, solo se pueden usar paréntesis individuales en las referencias de matriz).

La historia de los shells es que el viejo C shell tenía la configuración de un solo soporte, por lo que los shells desarrollados más tarde lo admiten por compatibilidad. (Si realmente quiere ir a la vieja escuela, use la prueba ... ¡pero sí!) La nueva configuración de doble parche permitió introducir ciertas mejoras fácilmente. Una mejora de la nota es que los operadores de redireccionamiento () ya no necesitan escapar.

Técnicamente [y] son ​​un shell integrado, mientras que [[y]] son ​​palabras clave. Una consecuencia de esto es que cada shell está garantizado para admitir [(es compatible con POSIX). Además, las pruebas admitidas por [[pueden variar de un entorno a otro.

Por cierto, las preguntas de programación de una naturaleza técnica específica a menudo están bien abordadas en el sitio StackExchange. En este sentido, puede consultar ¿Cuál es la diferencia entre corchetes dobles y simples en bash ?.