2017-09-22 3 views
2

Je suis très nouveau pour les scripts bash et voici ce que je suis en train de faire:Comment lire une entrée dans une boucle while en lisant un fichier?

1 - Lire un fichier - ce fichier est une liste de noms 2 - Demander à l'utilisateur s'ils veulent supprimer {name} 3 - Si l'utilisateur entre y, passez

C'est ce que mon script ressemble à ce jour:

while IFS= read -r repo 
    do 
     read -p "Do you want to delete $repo" ip 
     echo $ip 
     if [ "$ip" == "y" ] 
      then 
      #do something 
     fi 

    done < "$filename" 

La ligne read -p n'attend pas une invite utilisateur. J'ai en quelque sorte compris ce que/où le problème est et j'essayais de le résoudre en lisant sur ce lien - https://bash.cyberciti.biz/guide/Reads_from_the_file_descriptor_(fd)

Mais de toute façon je ne pouvais pas résoudre ce problème. Qu'est-ce que je fais mal? S'il vous plaît aider!

Répondre

4

Utilisez un descripteur de fichier différent pour le fichier nommé. Vous savez d'où proviennent ces données; vous ne savez pas d'où l'entrée standard pourrait être redirigée, alors laissez-le tranquille.

while IFS= read -r -u 3 repo # Read from file descriptor 3 
do 
    read -p "Do you want to delete $repo" ip # Read from whatever standard input happens to be 
    echo "$ip" 
    if [ "$ip" = "y" ] 
    then 
     #do something 
    fi 
done 3< "$filename" # Supply $filename on file descriptor 3 

-u est bash Spécifiques, mais je note que vous utilisez déjà un autre bash caractéristique spécifique de l'option -p-read. La méthode POSIX pour lire quelque chose d'autre que l'entrée standard est IFS= read -r repo <&3 (ce qui signifie copier le descripteur de fichier 3 sur l'entrée standard pour cette commande).

+0

Merci beaucoup! J'ai complètement raté la partie "3"! Je l'ai alors défini au début comme 'exec 3 <$ filename' et ça a marché! :) – Saturnian

+1

Je garderais la redirection sur la boucle, s'il n'y a pas besoin de garder le fichier ouvert plus longtemps. – chepner

2

Voir cette question:

Does bash support doing a read nested within a read loop?

Essentiellement, vous lisez dans le fichier de l'entrée standard qui est le même flux d'entrée que lorsque vous tapez, alors quand vous invite l'utilisateur, le script est traiter l'entrée du fichier comme l'entrée de l'utilisateur. Si vous lisez à la place dans le fichier sur un autre flux d'entrée, il ne sera pas écrasé.

+0

Oui! Il m'a fallu du temps pour comprendre que c'était ce qui se passait sous le capot. Je vous remercie! – Saturnian