2010-10-21 6 views
1

J'utilise la bourne shell sous UNIX, et je suis en cours d'exécution dans le problème suivant:Pourquoi ne puis-je pas lire correctement l'entrée de l'utilisateur dans une boucle UNIX?

#!/bin/sh 


while read line 
    do 

    echo $line 

    if [ $x = "true" ] 
    then 
     echo "something" 
     read choice 
     echo $choice 
    else 
     echo "something" 
    fi 

done <file.txt 

Le problème que j'ai ici est que UNIX ne va pas attendre l'entrée d'utilisateur dans la commande de lecture - il laboure seulement sur au lieu d'attendre ce que l'utilisateur tape. Comment puis-je faire unix attendre l'entrée de l'utilisateur?

Répondre

2

Il est parce que vous demandez au programme de lire à partir du fichier file.txt:

done <file.txt 

semble aussi que vous avez une faute de frappe ici:

if [ $x = "true" ] 
    ^^ 

qui devrait être "$line".
Notez également le ", sans eux votre programme se cassera si le mot lu dans le fichier a un espace dedans.

0

Je ne fais pas les scripts beaucoup shell, mais je pense que « lire choix » devrait être « lire choix $ »

2

La redirection d'entrée standard par le <file.txt à la fin de while ... done <file.txt affecte l'ensemble de la boucle while, y compris le read choice ainsi que la read line. Il ne s'agit pas seulement d'arrêter - il consomme aussi une ligne de votre fichier d'entrée.

est ici un moyen de résoudre le problème ...

Vous pouvez enregistrer l'entrée standard d'origine en utilisant le quelque peu obscur (même par rapport aux normes shell):

exec 3<&0 

qui ouvre le descripteur de fichier 3 à reportez-vous au descripteur de fichier d'origine 0, qui est l'entrée standard d'origine. (Les descripteurs de fichier 0, 1 et 2 sont respectivement des entrées, des sorties et des erreurs standard.) Ensuite, vous pouvez rediriger uniquement l'entrée de read choice pour provenir du descripteur de fichier 3 en faisant read choice <&3.

script de travail complet (je ne savais pas où x était censé venir, donc je viens de bodged pour le faire fonctionner):

#!/bin/sh 

x=true # to make the example work 

exec 3<&0 

while read line 
    do 

    echo $line 

    if [ $x = "true" ] 
    then 
     echo "something" 
     read choice <&3 
    else 
     echo "something" 
    fi 

done <file.txt