
ユーザー入力 (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
)。