[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Duda nombre de carpetas con espacios



On Fri, Feb 21, 2014 at 04:37:12PM -0500, Ismael L. Donis Garcia wrote:
> Estoy intentando realizar un script que va a ser ejecutado sh backup.sh
> 
> Pero resulta que dentro existe una carpeta que tiene espacios y no
> logro que me funcione:
> 
> He intentado de mil formas, pero ninguna me funciona:
> 
> con:
> DIR=/mnt/Salvas/Bases de Datos/diarias
> DIR=/mnt/Salvas/Bases\ de\ Datos/diarias
> DIR=/mnt/Salvas/'Bases de Datos'/diarias
> 
> Pero de ninguna forma va.
> 
> Como solventar esto sin eliminar los espacios?
Creo que ya un listero comentó, pero yo quiero recalcar en la
IMPORTANCIA de esto, ya que veo que los que te están pasando
sugerencias no tienen idea de lo que hablan.

Es de GRAN importancia que cuando utilices una variable, la protejas
con comillas dobles. Esto es, usa "$variable", nunca $variable. La
razón es un poco compleja, pero haré mi intento para simplificar.

Por estándar, el shell está mandado a aplicar estos dos pasos, a
aquellas variables que se expanden SIN resguardar con comillas
dobles:

1. Fragmentación en palabras
2. Expansión de patrones de tipo "glob"

La fragmentación en palabras significa que si tu variable contiene
espacios, al expandirla SIN comillas, el shell partirá lo que se
considera como una sola palabra, en múltiples, utilizando los
espacios como punto de fragmentación.

Esto lo puedes ver muy simple con este código:

dualbus@debian:~$ args(){ printf '<%s>' "$@"; printf \\n; }
dualbus@debian:~$ var='variable con espacios'
dualbus@debian:~$ args $var
<variable><con><espacios>
dualbus@debian:~$ args "$var"
<variable con espacios>

Si notas, en el primer caso, args recibe 3 argumentos, 'variable',
'con', y 'espacios', cada uno de forma individual. En el segundo
caso, cuando está entre comillas dobles, lo recibe como un solo
argumento (en tu caso es lo que buscas, que se preserve el nombre de
archivo como uno solo).

Nota: nunca uses el comando 'echo' para diagnosticar este tipo de
asuntos. Es inútil, ya que no puedes distinguir entre:

echo 'hola mundo'

y

echo hola mundo

que en realidad son comandos muy diferentes.

Ahora, para guardar espacios en el nombre es bastante sencillo, de
hecho hay tres maneras típicas:

1.- var='mi variable con espacios'
2.- var="mi variable con espacios"
3.- var=mi\ variable\ con\ espacios

Nota que no usé la aberración que es:

var="mi\ variable\ con\ espacios" # esto está MAL, MAL


Así que hasta el momento ya vimos cómo evitar que se pierdan tus
espacios, y cómo ponerlos en tus variables.

Una cosa particular es que puede que esté algún caracter adicional en
el nombre que no estés notando. Para diagnosticar esto, te recomiendo
hagas un:

printf '%q\n' /mnt/Salvas/Bases*

(nota, no omitas ningún caracter)

Con este comando, podrás darte cuenta de si hay algún caracter
escondido en el nombre que no estés notando. Y la ventaja es que su
resultado lo puedes usar para definir la variable:

dualbus@debian:~$ mkdir 'Nombre Con Espacios'
dualbus@debian:~$ printf '%q\n' Nombre*
Nombre\ Con\ Espacios

por lo que puedes hacer:

nombre=Nombre\ Con\ Espacios

También, como recomendó otro listero, puedes usar sh -x tuscript para
diagnosticar problemas, y ver que realmente haga lo que tú pretendes.


En resúmen: Para guardar cadenas con espacios basta con utilizar ya
sea comillas sencillas ('), dobles ("), o el contradiagonal (\). Esto
es para *guardar* en la variable. Para utilizar la variable, y que no
se *pierdan* los espacios, recuerda poner la variable entre comillas
dobles: "$var", nunca $var.

De tal forma que al final tengas algo así:


DIR='/mnt/Salvas/Bases de Datos/diarias'
echo prueba > "$DIR/archivo-de-prueba"


Este es un ejemplo de como utilizar la variable para crear un archivo
dentro del directorio.


Saludos,

-- 
Eduardo Alan Bustamante López


Reply to: