
Я пытаюсь создать вложенный оператор case, в котором ожидается ввод пользователя (Y/N). Однако система никогда не ждет ввода и всегда переходит к третьему варианту: «Пожалуйста, ответьте да или нет». Может кто-нибудь сказать мне, что я упускаю?
Вот изложение дела
#!/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
Я пытаюсь выполнить это в RHEL 6.
решение1
Команда read
выполняется в конвейере — она находится внутри while
цикла, ввод которого перенаправляется из вывода команды find
— поэтому при чтении она читает из списка find
сгенерированных файлов, а не из терминала. Самый простой известный мне способ исправить это — отправить список файлов через что-то, отличное от стандартного ввода, чтобы стандартный ввод можно было использовать для других целей (например, для подтверждения пользователя). Пока вы не используете дескриптор файла № 3 для чего-то еще, это должно работать:
# ...
while IFS= read -r -u3 -d '' FILE; do
# same inside of the loop...
done 3< <(find /etc/init.d/* -name '*service' -print0)
Говорит читать из FD3, а перенаправляет FD3 из вывода команды . Обратите внимание, что ( -u3
известный как подстановка процесса) является расширением bash (недоступным в простых оболочках posix), поэтому вы должны использовать его только в скриптах, с которых вы начинаете (не ).read
3< <(find...)
find
<( )
#!/bin/bash
#!/bin/sh