ネストされた case ステートメントではユーザー入力が受け入れられません

ネストされた case ステートメントではユーザー入力が受け入れられません

ユーザー入力 (Y/N) が求められるネストされたケース ステートメントを作成しようとしています。しかし、システムは入力を待たず、常に 3 番目のオプション「はいまたはいいえで回答してください」に進みます。何が足りないのか、誰か教えていただけませんか?

ケースステートメントはこちら

 #!/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 から読み取るように-u3指示しread、 はコマンド3< <(find...)の出力から FD3 をリダイレクトしますfind<( )(プロセス置換と呼ばれる)は bash 拡張機能(プレーンな posix シェルでは使用できません)であるため、 で始まるスクリプトでのみこれを使用する必要があります#!/bin/bash( ではありません#!/bin/sh)。

関連情報