사용자 입력(예/아니요)이 필요한 중첩된 사례 문을 만들려고 합니다. 그러나 시스템은 입력을 기다리지 않고 항상 세 번째 옵션인 "예 또는 아니요로 대답하세요"로 이동합니다. 내가 무엇을 놓치고 있는지 말해 줄 수 있는 사람이 있나요?
사건설명입니다
#!/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