Pregunta

Estoy tratando de crear un simple for bucle que tomará todas las salidas de un ls comando y coloque cada salida en una variable. Hasta ahora tengo

for i in ls /home/svn
do
    echo $i
done

Pero me da un error.

¿Fue útil?

Solución

Porque el ls necesita ser ejecutado:

for i in $(ls ...); do
  echo $i
done

Además, es posible que desee considerar Shell Globbing:

for i in /home/svn/*; do
  echo $i
done

... o find, que permite la selección de propiedades de grano muy fino para encontrar:

for i in $(find /home/svn -type f); do
  echo $i
done

Además, si puede tener espacio en blanco en los segmentos de la ruta o los nombres de archivo, use un bucle de tiempo (ejemplo anterior ajustado):

find /home/svn -type f|while read i; do
  echo $i
done

while Lee en cuanto a línea, de modo que se conserva el espacio en blanco.

Sobre la llamada de basename tienes dos opciones:

# Call basename
echo $(basename $i)
# ... or use string substitution
echo ${i##*/}

Para explicar la sustitución: ## Elimina el patrón frontal más largo de la cadena, # hasta la primera coincidencia de patrón, %% el patrón más largo y atrasado y % El primer partido completo en el fondo.

Otros consejos

No necesitas usar ls Para repasar los archivos en este caso, lo siguiente hará el trabajo: for i in /home/svn/*; do echo $i; done

Desea asignar la salida del comando LS a I, por lo que debe encerrarlo en Backticks o el operador $ ():

for i in $(ls /home/svn)
do
    echo $i
done

Eso es porque lo estás haciendo mal en primer lugar.

for i in /home/svn/*
do
  echo "$i"
done
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top