2012-03-13 3 views
5

Avevo un file bash che chiedeva all'utente alcuni parametri e usava i valori di default se non veniva dato nulla. Lo script ha poi eseguito altri comandi con i parametri. Questo ha funzionato alla grande - nessun problema fino all'aggiunta più recente.Come leggere l'utente all'interno della linea di lettura while-loop?

In un tentativo di leggere il parametro NAMES da un file txt, ho aggiunto un ciclo while per prendere i nomi nel file, ma mi piacerebbe comunque che venissero richiesti i parametri rimanenti.

Ma una volta aggiunto il ciclo while, l'output mostra il prompt stampato in get_ans() e non si interrompe mai per una lettura, quindi vengono selezionati tutti i valori predefiniti.

Vorrei leggere il primo parametro da un file, quindi tutti i file successivi dal prompt dell'utente.

Cosa ho interrotto aggiungendo il ciclo while?

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:. Codice non è copia & pasta così vi prego di scusare errori di battitura codice vero e proprio ha funzione definita prima del main())

+0

mi piacerebbe guardare le vostre altre risposte (uno dei quali racconta come _solve_ il problema, non solo quello che è) prima di prendere una decisione di accettare. –

risposta

3

Inserisci i dati nei tuoi loop while STDIN. Quindi lo read in get_ans sta anche acquisendo dati da quel flusso STDIN.

È possibile i dati di tubo in mentre in diversi descrittore di file per evitare il problema e fermano fastidio con i file temporanei:

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

ottenuto durante la lettura <& 9 –

1

Quando si reindirizza un comando in un altro sulla riga di comando, come:

$ foo | bar 

Il guscio sta per impostarlo in modo che bar 'standard input s proviene da foo' standard output s. Qualsiasi cosa che foo invia a stdout passerà direttamente allo stdin di bar.

Nel tuo caso, questo significa che l'unica cosa che lo script può leggere è lo standard output del comando cat, che conterrà il contenuto del tuo file.

Invece di utilizzare una pipe sulla riga di comando, rendere il nomefile come il primo parametro del proprio script. Quindi apri e leggi dal file all'interno del tuo codice e leggi dall'utente normalmente.

+0

Va bene, ha senso. Grazie –

+0

Ok, tubo rimosso e usato mentre si legge linea; do ... done <$ 1 e salta ancora le letture di input. –

3

per leggere direttamente dal terminale, non dallo standard input (supponendo che si sta su un * NIX macchina, non una macchina Windows):

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