1 votos

Variable de escape en script

Estoy usando script.sh en una terminal de OS X Mavericks que sólo contiene lo siguiente:

echo ${1}
ls ${1}

Ahora, cuando llamo a ./script.sh "/Users/me/some\ directoy\ with\ whitespace/" el comando echo imprime /Users/me/some\ directoy\ with\ whitespace/ pero ls sigue insistiendo en dividir todo, por lo que los resultados allí son

ls: /Users/me/some\: No such file or directory
ls: directoy\: No such file or directory
ls: with\: No such file or directory
ls: whitespace/: No such file or directory

Fíjese en el \ al final de las tres primeras líneas de error. ¿Cómo puedo hacer esto correctamente?

(Soy consciente de que usar tanto "" como \ en el argumento de entrada deja el \ en mi variable, pero asumo que los necesitaría).

También he probado a utilizar ./script.sh /Users/me/some\ directoy\ with\ whitespace/ sin las comillas, entonces haciendo el script

echo ${1}
ls "${1}"

pero eso hizo que el echo no contiene ninguna \ ahora, y el ls la salida tiene este aspecto:

ls: "/Users/me/some\: No such file or directory
ls: directoy\: No such file or directory
ls: with\: No such file or directory
ls: whitespace/": No such file or directory

Fíjate que lo único que ha hecho es añadir las comillas sin que parezca que las entiende como sintaxis.


Está relacionado de alguna manera con el IFS (separador de campos de entrada) ya que si hago el script

IFS=*
ls ${1}

y ejecutarlo como ./script.sh /Users/me/some\ directoy\ with\ whitespace/ me muestra correctamente el contenido del directorio especificado. Sin embargo, no estoy seguro de por qué.

2voto

Neil McKeown Puntos 348

No necesitas los frenos. Esto debería funcionar bien:

echo $1
ls "$1"

No es conveniente utilizar barras invertidas ni comillas en el nombre del directorio. Una u otra debería estar bien.

1voto

staffan Puntos 3299

El script correcto es

#!/bin/bash
echo "${1}"
ls "${1}"

(Puede empezar con #!/bin/sh si lo prefiere).

La sintaxis de bash y otros shells es un poco rara. Puedes pensar que $var significa "el valor de var ", pero no es así. Significa "tomar el valor de var y dividirlo en cada secuencia de espacios en blanco (o más generalmente, dividirlo según el valor de IFS ), e interpretar cada parte como un patrón glob que, si coincide con algún archivo, se sustituye por la lista de coincidencias". Sí, eso es un buen trabalenguas - por lo que siempre debe escribir "$foo" en su lugar. Ponga siempre comillas dobles alrededor de las sustituciones de variables, a menos que sepa por qué necesita dejarlas fuera. Dentro de las comillas dobles, el significado de "$foo" es "el valor de la variable foo ".

Ver ¿Por qué mi shell script se ahoga con los espacios en blanco u otros caracteres especiales? para profundizar en este tema.

Para invocar su script, puede utilizar cualquier forma de cita - pero sólo una:

./script.sh /Users/me/some\ directoy\ with\ whitespace/
./script.sh "/Users/me/some directoy with whitespace/"
./script.sh '/Users/me/some directoy with whitespace/'

Si ./script.sh /Users/me/some\ directoy\ with\ whitespace/ no funciona con las comillas en el script, entonces no estás escribiendo eso en un shell bash. No puedo adivinar en qué otra cosa podrías estar escribiéndolo. O bien no has probado con la versión del script que creías tener.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X