ユーザー入力(はい/いいえ)が必要なネストされたケースステートメントを作成しようとしています。ただし、システムは入力を待たずに、常に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から読み出され、コマンドの出力が-u3
FD3にリダイレクトされることを示します。 (プロセス置換と呼ばれる)はbash拡張(通常のposixシェルでは使用できません)なので、起動するスクリプトでのみ使用する必要があります。read
3< <(find...)
find
<( )
#!/bin/bash
#!/bin/sh