Digamos que tenemos 2 enteros en un script bash:
value1=5
value2=3
Entonces, ¿por qué necesitamos usar comillas dobles en caso de una prueba? Por ejemplo:
if [[ "$value1" -eq "$value2" ]]
¿Por qué no solo usar lo siguiente?
if [[ $value1 -eq $value2 ]]
Para mí, las comillas dobles no tienen ningún sentido.
5
y3
, es la mantenibilidad. Los valores pueden cambiar más tarde y los errores resultantes pueden no ser obvios.[[ ]]
, solo para[ ]
.[[ ]]
ellas también obligan a los operandos-eq
a enteros.Respuestas:
Palabra dividida.
Este ejemplo es muy improbable, pero posible , así que si quieres codificar defensivamente, cubre tus pistas con comillas:
OK, todo bien hasta ahora. Arrojemos la llave a los engranajes:
Ups
Ahh
fuente
[[ ]]
construcción de bash .[ $value1 -eq $value2 ]
con un vacíovalue1
sería'[' -eq 3 ']'
sin un''
en el lado izquierdo.Realmente no necesitas las citas aquí. Este es uno de los pocos casos en los que es seguro usar una variable sin comillas. Puede confirmar esto con
set -x
:Como puede ver arriba, bash resuelve las versiones citadas y no citadas de la prueba. Lo mismo debería ser cierto para
zsh
y, creo, cualquier otro shell que admita el[[ ]]
operador.Tenga en cuenta que este no es el caso con los más portátiles
[ ]
:El
[ ]
constructo, a diferencia del anterior[[ ]]
, requiere una cita.Algunos enlaces útiles para obtener más información sobre cuándo y por qué se requiere una cita:
fuente
declare -i var1=
es0
cuando se evalúa.-eq
es una comparación aritmética , por lo que incluso puede dejar$
fuera (dentro[[ .. ]]
) y escribir[[ a -eq b ]]
. Con la comparación de cadenas, necesita$
, por supuesto, así que[[ $a = $b ]]
var1="afoob"; var2="a*b"; [[ $var1 = $var2 ]] && echo match
. Si desea utilizar los caracteres glob sin que actúen como un glob en un contexto global (como el[[ ]]
), entonces necesita citar, sí.((...))
o$((...)
. Parece funcionar, pero (viejo gruñón, habilítelo) No me gusta.-eq
y los amigos en el interior también[[ ]]
son contextos aritméticos. :) (Relacionado: Expansión variable automática dentro del comando bash [[]] )Aunque las comillas dobles no son necesarias, las razones para usarlas son:
value1
yvalue2
son variables, y es posible que no sepas lo que contienen. De lo contrario, podría preguntar: "¿Por qué molestarse con las variables en lugar de verificarif [[ 5 -eq 3 ]]
? Oif
ir más allá, ¿por qué molestarse con el cuando ya sabes que 5 no es igual a 3? A menudo es mejor estar a la defensiva. (Es cierto esa palabra de división no va a ocurrir en[[
, pero los casos en que la palabra de división no no suceden son raros. Una vez más, ver el primer punto.)fuente
No está directamente relacionado con tu pregunta, pero yo uso
cuando comparo números pero allí tampoco tienes que usar comillas.
fuente
if (( value1 == value2 )); then
. En contextos aritméticos, ni siquiera necesita el$
. Sin embargo, esta pregunta parece centrarse en las variables utilizadas en las[[ ... ]]
pruebas.¡Tienes toda la razón!
La cita entre corchetes dobles no tiene ningún sentido, al menos en este caso.
Pero dado que uso comillas dobles a diario, especialmente para expresiones de corchetes simples, pasando argumentos a funciones y scripts, así como a veces asignación de variables (lo cual es completamente inútil para delicaciones simples), supongo que algunas personas, al menos lo hago, escribir comillas dobles alrededor de expansiones variables instintivamente .
Un beneficio de hacer comillas dobles en consecuencia y de manera comprensible , pero solo porque tiene sentido, es que los compañeros de trabajo que son nuevos en bash pueden aprender a escribir guiones más estables . También acentúa el hecho de que el arte del procesamiento de datos con bash se trata más de separar las secuencias de datos (incluidas las variables) mediante separadores de campo y canalizarlos a través de filtros . ¡Tan pronto como separe sus fragmentos de datos de la transmisión, manténgalos juntos con comillas dobles!
Otro beneficio podría ser la mejor legibilidad de los scripts de bash con cadenas entre comillas dobles dentro de un editor de resaltado de código .
fuente