scripts script programacion for español ejemplos comando ciclo bucle bash while-loop stdin pipe

script - Cómo canalizar la entrada a un bucle Bash while y conservar las variables después de que finalice el bucle



scripts bash ejemplos (2)

La notación correcta para la Sustitución de procesos es:

while read i; do echo $i; done < <(echo "$FILECONTENT")

El último valor de i asignado en el ciclo está entonces disponible cuando termina el ciclo. Una alternativa es:

echo $FILECONTENT | { while read i; do echo $i; done ...do other things using $i here... }

Los refuerzos son una operación de agrupamiento de E / S y no crean ellos mismos una subshell. En este contexto, forman parte de una canalización y, por lo tanto, se ejecutan como una subcadena, pero es debido a la | , no el { ... } . Usted menciona esto en la pregunta. AFAIK, puedes hacer un regreso desde dentro de estas dentro de una función.

Bash también proporciona el shopt incorporado y una de sus muchas opciones es:

lastpipe

Si se establece, y el control del trabajo no está activo, el shell ejecuta el último comando de una tubería no ejecutada en segundo plano en el entorno de shell actual.

Por lo tanto, usar algo como esto en una secuencia de comandos hace que la sum modificada esté disponible después del ciclo:

FILECONTENT="12 Name 13 Number 14 Information" shopt -s lastpipe # Comment this out to see the alternative behaviour sum=0 echo "$FILECONTENT" | while read number name; do ((sum+=$number)); done echo $sum

Hacer esto en la línea de comando generalmente falla si ''el control del trabajo no está activo'' (es decir, en la línea de comando, el control del trabajo está activo). Probando esto sin usar un script falló.

Además, como notó Gareth Rees en su answer , a veces puedes usar una cadena aquí :

while read i; do echo $i; done <<< "$FILECONTENT"

Esto no requiere shopt ; Puede guardar un proceso usándolo.

Bash permite usar: cat <(echo "$FILECONTENT")

Bash también permite usar: while read i; do echo $i; done </etc/passwd while read i; do echo $i; done </etc/passwd

para combinar los dos anteriores esto se puede usar: echo $FILECONTENT | while read i; do echo $i; done echo $FILECONTENT | while read i; do echo $i; done

El problema con el último es que crea sub-shell y después de que el ciclo while termine la variable ya no se puede acceder a ella.

Mi pregunta es:

Cómo lograr algo como esto: while read i; do echo $i; done <(echo "$FILECONTENT") while read i; do echo $i; done <(echo "$FILECONTENT") while read i; do echo $i; done <(echo "$FILECONTENT") o en otras palabras: ¿cómo puedo estar seguro de que sobrevivo durante el ciclo?

Tenga en cuenta que soy consciente de adjuntar el enunciado while en {} pero esto no resuelve el problema (imagine que desea usar el ciclo while en la función y devolver la variable i )


Jonathan Leffler explica cómo hacer lo que quiere usando la sustitución de procesos , pero otra posibilidad es usar una cadena aquí :

while read i; do echo "$i"; done <<<"$FILECONTENT"

Esto ahorra un proceso.