2011-12-27 17 views

Respuesta

22

Simplemente no utilice la sustitución de comando: use for name in *.

+0

Tenga en cuenta que esto puede fallar en un directorio vacío. Thee loop se ejecutará una vez con 'name =" * "'. No es un problema en este caso particular sin embargo. – user123444555621

+0

Si se convierte en un problema, 'shopt -s nullglob' hará que' * 'se expanda a cero palabras si no hay coincidencias. – ephemient

12

Reemplazar

 
for name in `ls` 

con:

 
ls | while read name 

Aviso: Bash ámbito de las variables es horrible. Si cambia una variable dentro del ciclo, no tendrá efecto fuera del ciclo (en mi versión no lo hará, en su versión sí lo hará). En este ejemplo, no importa.

Aviso 2: Esto funciona para nombres de archivos con espacios, pero falla para algunos otros nombres de archivos extraños pero válidos. Vea el comentario de Charles Duffy a continuación.

+0

"Si cambia una variable dentro del bucle, no tendrá efecto fuera del bucle. Si cambia una variable dentro del bucle, no tendrá efecto fuera del bucle" - si usa su construcción, sí, porque lo que sea es después de que la tubería se lanza en una subcapa. Por lo tanto, se espera que tenga un alcance variable diferente. – fge

+0

Creo que el comportamiento de bash aquí es errático. Si lo comprende, y parece que usted (es decir, fge) lo hace, entonces sabrá qué esperar. Pero lo aprendí de la manera difícil, todavía me parece extraño. – ugoren

+0

'ls | mientras el nombre de lectura es incorrecto. No maneja correctamente los nombres de archivos con barras diagonales inversas, o nombres de archivos con nuevas líneas literales, o nombres de archivos con espacios en blanco iniciales o finales. –

3

se parece dos posibles problemas:

En primer lugar, la variable IFS y es tarea no debe tener espacio en ellos. En lugar de

IFS = '\n' debe ser IFS=$'\n'

En segundo lugar, for name in ls causará problemas con el nombre de archivo que tiene spaces y newlines. Si sólo desea manejar filename con spaces luego hacer algo como esto

for name in *

No entiendo el significado de la línea

number=`echo "$name" | grep -o "[0-9]\{1,2\}"` 

Esto le dará los números que se encuentran en filename with spaces en new lines . Puede ser eso es lo que quieres.

+0

En realidad, debería ser 'IFS = $ '\ n'' - sin el' $ ',' \ n' no se interpreta como una línea nueva, sino como una barra invertida literal y la letra "n". –

+0

Vaya ... buena captura, arreglado. Gracias Gordon. :) –

Cuestiones relacionadas