Sé que las variables en bash no tienen tipo, pero estoy confundido sobre el valor que se les asigna.
El siguiente script simple funciona bien en bash
#!/bin/bash
tail -n +2 /cygdrive/c/workdir\ \(newco\,\ LLC\)/workfile.txt > \
/cygdrive/c/workdir\ \(newco\,\ LLC\)/workfile2.txt
Sin embargo, lo siguiente no
#!/bin/bash
tmpdir=/cygdrive/c/workdir\ \(newco\,\ LLC\)
tail -n +2 $tmpdir/workfile.txt > $tmpdir/workfile2.txt
¿Hay alguna explicación para este comportamiento?
tmp
, podría hacer algo como${tmp}dir/workfile.txt
sustituirla en lugar de la completa$tmpdir
(suponiendo que también exista).Escriba la primera línea en bash y luego repita esa variable, esto es lo que verá:
Si aún no está claro cuál es el culpable, agregue
echo
al comienzo de su segunda línea y envuélvala entre comillas dobles. Verá qué comando se ejecuta realmente:Has escapado correctamente de la asignación de variables, pero eso no es suficiente. Bash realiza una simple sustitución de subcadena, insertando espacios adicionales y rompiendo su comando.
Como @savanto sugirió en su respuesta, puede ajustar las variables entre comillas dobles para garantizar que los espacios adicionales no se traten como separadores de argumentos. Esta línea:
se verá así después de la sustitución de variables:
Esta es la forma más común y preferida de resolver ese problema. Si desea desesperadamente evitar las comillas dobles, puede intentar el doble escape: primero al asignar, luego después de la sustitución.
Explicación rápida de las barras invertidas triples: una barra invertida significa: "tratar el siguiente carácter como un carácter normal, ignorar cualquier significado especial" (es decir, escapar de él ). La primera barra diagonal inversa es un carácter de escape, por lo que la segunda se tratará como un carácter de barra diagonal inversa, no como un carácter de escape. Por lo tanto, la doble barra invertida produce una sola barra invertida. El tercero simplemente escapa al siguiente personaje, como el espacio o el paréntesis. Por ejemplo
a\\\ b
se convertiráa\ b
.Ahora, si sustituimos variables en su comando, se escapará correctamente:
fuente