入れ子になったケースステートメントではユーザー入力は許可されません。

入れ子になったケースステートメントではユーザー入力は許可されません。

ユーザー入力(はい/いいえ)が必要なネストされたケースステートメントを作成しようとしています。ただし、システムは入力を待たずに、常に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端末ではなく結果ファイルのリストから読み込みます。この問題を解決するために私が知っている最も簡単な方法は、stdin以外の手段を介してファイルのリストを送信することです。その後、stdinは依然として他の目的(たとえば、ユーザーの確認)として使用できます。他の目的でファイル記述子#3を使用しない限り、これはうまくいきます。

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

FD3から読み出され、コマンドの出力が-u3FD3にリダイレクトされることを示します。 (プロセス置換と呼ばれる)はbash拡張(通常のposixシェルでは使用できません)なので、起動するスクリプトでのみ使用する必要があります。read3< <(find...)find<( )#!/bin/bash#!/bin/sh

関連情報