
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 read
Befehl wird in einer Pipeline ausgeführt – er befindet sich innerhalb der while
Schleife, deren Eingabe von der Ausgabe des find
Befehls umgeleitet wird –, sodass er beim Lesen aus der Liste der generierten Dateien liest find
und 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 -u3
weist an read
, von FD3 zu lesen, und das 3< <(find...)
leitet FD3 von der Ausgabe des find
Befehls 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.