Problema con bucle while y variable

Imagen de alvaro87
0 puntos

Un saludo amigos. Estoy intentando hacer un ejercicio de clase pero resulta un tanto extraño porque el bucle while destruye la variable al finalizar, es decir, cuando yo la muestro fuera del bucle, su valor es de 0. Os pego el código del script a ver si me podéis echar una mano.

Muchas gracias.

#22. script que mueva todos los programas (archivos ejecutables) del directorio #actual hacia el subdirectorio bin del directorio de inicio de sesión, mostrando #los nombres de los ficheros que mueve, e indicando al final cuántos ha movido, o #si no ha movido ninguno. Si el directorio bin no existe, deberá ser creado.

#!/bin/bash
clear
contador=0

find . -name "*" | while read linea
do
	if [ -e $HOME/bin ]; then

		if [ -x "$linea" ]; then
		
			cp "$linea" $HOME/bin/
			let contador=contador+1
		fi
	else
	
		mkdir $HOME/bin
	fi

done

		echo "$contador"

if [ $contador -gt 0 ];then

	echo "Se han movido $contador programas a $HOME/bin/"
else

	echo "No se ha movido ningún programa"
fi
Imagen de joseluis
+1
0
-1

Tengo la impresión que la tubería está abriendo otra shell donde se ejecuta el bucle, por lo que si es así, las variables que modificas en esa shell no se reflejan en la shell padre.

Puedes montar el bucle de otra manera para evitar esto, en lugar de

  find . -name '*' | while read linea
  do
  ...
  done

puedes hacerlo de esta otra forma:

  while read linea
  do 
  ...
  done <<< "$(find . -name '*')"

Con la segunda opción, te mantiene el valor de la variable al salir del bucle.

+1
0
-1

Fdo. Forense asesino, Censor fundamentalista, Fustigador de novatos y Patético maleducado

Imagen de joseluis
+1
0
-1

Estoy revisando tu script y podrias tener un par de pequeño problemas tal como lo estás codificando.

Si no existe $HOME/bin no va a intentar mover el primer fichero que te encuentre, ya que esa iteración la gastará en crear el directorio, a parte que no parece muy óptimo preguntar en cada iteración si existe el directorio cuando lo puedes hacer una única vez antes del bucle.
Por otra parte, si lo que recuperas no es un fichero sino un directorio lo va a intentar mover también, ya que los directorios tienen permisos de ejecución. Para evitar este problema en el if donde preguntas si es ejecutable el fichero deberías preguntar además si no es un directorio:

    #!/bin/bash
    clear
    contador=0
    if [ ! -e $HOME/bin ]; then
        mkdir $HOME/bin
    fi

    while read linea
    do
        if [ ! -d "${linea}" -a -x "$linea" ]; then
            cp "$linea" $HOME/bin/
            let contador=contador+1
        fi
    done <<< "$(find . -name '*')"
    echo "$contador"
    if [ $contador -gt 0 ];then
        echo "Se han movido $contador programas a $HOME/bin/"
    else
        echo "No se ha movido ningun programa"
    fi
+1
0
-1

Fdo. Forense asesino, Censor fundamentalista, Fustigador de novatos y Patético maleducado

Imagen de alvaro87
+1
0
-1

Muchas gracias por la ayuda.

+1
0
-1