Benutzereingaben werden in verschachtelten Case-Anweisungen nicht akzeptiert

Benutzereingaben werden in verschachtelten Case-Anweisungen nicht akzeptiert

Ich versuche eine verschachtelte Case-Anweisung zu erstellen, in der eine Benutzereingabe erwartet wird (J/N). Das System wartet jedoch nie auf die Eingabe und geht immer zur dritten Option „Bitte mit Ja oder Nein antworten“. Kann mir jemand sagen, was mir fehlt?

Hier ist die Fallaussage

 #!/bin/bash

SERVSTAT=/mnt/support/scripts/log/serverstatus.txt
FUSE_PATH=/home/jet/instances/
LOG=data/log/karaf.log
echo " " >  $SERVSTAT
STATUS=status

find /etc/init.d/* -name '*service' -print0 | while IFS= read -r -d '' FILE;
do
if [ "$FILE" != "." -o "$FILE" != ".." ]; then
APP_NAME=`echo ${FILE:12} | sed 's/-service//'`
        OUTPUT=$($FILE $STATUS)
case "$OUTPUT" in
    *not* )
        echo "Do you wish to start $APP_NAME ?"
        read  yn
        case $yn in
         [yY] | [yY][Ee][Ss] )
                $FILE start
                tail -f $FUSE_PATH/$APP_NAME/$LOG
                ;;
         [nN] | [n|N][O|o] )
                ;;
        * )
        echo "Please answer yes or no.";;
        esac
        ;;
       * )
        echo "App $APP_NAME is running"
esac
fi
done

Ich versuche, dies in RHEL 6 auszuführen

Antwort1

Der readBefehl wird in einer Pipeline ausgeführt – er befindet sich innerhalb der whileSchleife, deren Eingabe von der Ausgabe des findBefehls umgeleitet wird –, sodass er beim Lesen aus der Liste der generierten Dateien liest findund nicht aus dem Terminal. Die einfachste mir bekannte Möglichkeit, dies zu beheben, besteht darin, die Liste der Dateien über etwas anderes als die Standardeingabe zu senden, sodass die Standardeingabe weiterhin für andere Dinge (wie die Benutzerbestätigung) verwendet werden kann. Solange Sie Dateideskriptor Nr. 3 nicht für etwas anderes verwenden, sollte dies funktionieren:

# ...
while IFS= read -r -u3 -d '' FILE; do
    # same inside of the loop...
done 3< <(find /etc/init.d/* -name '*service' -print0)

Das -u3weist an read, von FD3 zu lesen, und das 3< <(find...)leitet FD3 von der Ausgabe des findBefehls um. Beachten Sie, dass das <( )(bekannt als Prozesssubstitution) eine Bash-Erweiterung ist (nicht verfügbar in einfachen POSIX-Shells), Sie sollten es also nur in Skripten verwenden, die Sie mit #!/bin/bash(nicht #!/bin/sh) beginnen.

verwandte Informationen