2012-03-13 5 views
5

Tenía un archivo bash que pedía al usuario algunos parámetros y utilizaba los valores predeterminados si no se daba nada. El script luego pasó a realizar algunos otros comandos con los parámetros. Esto funcionó muy bien, no hubo problemas hasta la adición más reciente.¿Cómo leer desde el usuario dentro de la línea de lectura while-loop?

En un intento de leer el parámetro NAMES desde un archivo txt, he agregado un while-loop para incluir los nombres en el archivo, pero me gustaría que me pidieran los parámetros restantes.

Pero una vez que agregué el ciclo while, el resultado muestra el mensaje impreso en get_ans() y nunca hace una pausa para leer, por lo tanto se seleccionan todos los valores predeterminados.

Me gustaría leer el primer parámetro de un archivo, luego todos los archivos subsiguientes después de preguntar al usuario.

¿Qué he roto al agregar el while-loop?

cat list.txt | 
while read line 
do 
    get_ans "Name" "$line" 
    read NAME < $tmp_file 

    get_ans "Name" "$line" 
    read NAME < $tmp_file 
done 

function get_ans 
{ 
    if [ -f $tmp_file ]; then 
    rm $tmp_file 

    PROMPT=$1 
    DEFAULT=$2 

    echo -n "$PROMPT [$DEFAULT]: " 
    read ans 
    if [ -z "$ans" ]; then 
    ans="$DEFAULT" 
    fi 
    echo "$ans" > $tmp_file 
} 

(NOTA:. Código no se copia & pasta así que disculpen los errores tipográficos código real ha definido la función antes de que el principal())

+0

me vería en sus otras respuestas (una de las cuales le indica cómo _solve_ el problema, no sólo lo que es) antes de tomar una decisión de aceptar. –

Respuesta

3

Usted datos de la tubería en su while bucles STDIN. Entonces, el read en get_ans también está tomando datos de esa corriente STDIN.

Puede datos del tubo en mientras que en un descriptor de archivo diferente para evitar el problema y dejar de molestar a los archivos temporales:

while read -u 9 line; do 
    NAME=$(get_ans Name "$line") 
done 9< list.txt 

get_ans() { 
    local PROMPT=$1 DEFAULT=$2 ans 
    read -p "$PROMPT [$DEFAULT]: " ans 
    echo "${ans:-$DEFAULT}" 
} 
+0

lo obtuve mientras leía <& 9 –

1

Cuando se canaliza una orden a otra en la línea de comandos, como:

$ foo | bar 

La cáscara se va a configurarlo de manera que bar 'entrada estándar s proviene de foo' salida estándar s. Todo lo que foo envíe a stdout irá directamente al bar's stdin.

En su caso, esto significa que lo único que puede leer la secuencia de comandos es la salida estándar del comando cat, que contendrá el contenido de su archivo.

En lugar de utilizar un conducto en la línea de comando, haga que el nombre del archivo sea el primer parámetro de su secuencia de comandos. A continuación, abra y lea desde el archivo dentro de su código y léalo del usuario como siempre.

+0

Muy bien, eso tiene sentido. Gracias –

+0

Bien, se retiró la tubería y se usó mientras se leía la línea; do ... done <$ 1 y sigue omitiendo lecturas de entrada. –

3

para leer directamente desde el terminal, no desde la entrada estándar (asumiendo que usted está en una * NIX máquina, no una máquina Windows):

while read foo</some/file; do 
    read bar</dev/tty 
    echo "got <$bar>" 
done 
Cuestiones relacionadas