2010-08-07 21 views
7

En varias guías y scripts me encuentro con que la gente tiende a usar una sintaxis diferente de enunciados if. ¿Cuál es la diferencia y cuáles son las mejores prácticas? Creo que todas las siguientes afirmaciones, y muchas más variantes, serán verdaderas:sintaxis de sentencia bash/sh if

bar="foo" 
if [ "foo" = "foo" ] 
if [[ "foo" == $bar ]] 
if [ "foo" = "$bar" ] 
if [[ "foo" = "$bar" ]] 
if [[ "foo" -eq $bar ]] 
+1

posible duplicado de [bash: soporte doble o simple, paréntesis, llaves]] (http://stackoverflow.com/questions/2188199/bash-double-or-single-bracket-parentheses-curly-braces) –

+0

Leer http://mywiki.wooledge.org/BashGuide http://mywiki.wooledge.org/BashFAQ http://mywiki.wooledge.org/BashPitfalls – Philipp

Respuesta

5

Según entiendo

= espera cuerdas

eq espera enteros

"$" es la barra de partidos literal, es decir, z * puede expandirse, pero "z *", literalmente, que coincida con el comodín char

La diferencia entre [] y [[]] es que en la última división de palabra y la expansión del nombre de ruta no están hechas, pero están en la primera.

Plus [[]] permite a los operadores adicionales:

& & (AND), || (OR), > (Cadena1 léxicamente mayor que String2), < (Cadena1 léxicamente menos de String2)

El operador de comparación == comporta de manera diferente dentro de una prueba de doble soportes que dentro de los soportes individuales.

[[$ a == z *]] # Verdadero si $ a comienza con una "z" (coincidencia de patrones).

[[$ a == "z *"]] # Verdadero si $ a es igual a z * (concordancia literal).

[$ a == z *] # La fragmentación de archivos y división de palabras tiene lugar.

["$ a" == "z *"] # Verdadero si $ a es igual a z * (concordancia literal).

Salida http://tldp.org/LDP/abs/html/comparison-ops.html para obtener más información

+0

Corrección/aclaración menor: '=' y '==' hacen exactamente lo Lo mismo (es decir, ambos hacen coincidencia de patrones dentro de '[[]]'), excepto que algunas implementaciones de '[' no admiten '=='. Básicamente, la única razón para usar '==' es que es familiar desde otros lenguajes. Además, '[' admite comparaciones de cadenas con '<' and '>', solo tiene que escapar de ellas o se analizarán como redirecciones de E/S: '[string1 \

2

Recomiendo case/esac.

case "$foo" in 
    "bar") echo "bar";; 
    *) echo "not equal";; 
esac 

Sin preocuparse por la sintaxis diferente.

3

[ es una orden interna del bash, [[ es una palabra clave bash. La mejor práctica es usar siempre [[ si el script no tiene que ser compatible con otros shells (por ejemplo, si comienza con #!/bin/bash), y usa [ solo para compatibilidad con el shell Bourne. Ver http://mywiki.wooledge.org/BashFAQ/031.

Cuestiones relacionadas