
Estou tentando criar uma instrução case aninhada na qual a entrada do usuário é esperada (S/N). Porém, o sistema nunca espera pela entrada e sempre vai para a terceira opção, “Responda sim ou não”. Alguém pode me dizer o que estou perdendo?
Aqui está a declaração do caso
#!/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
Estou tentando executar isso no RHEL 6
Responder1
O read
comando está acontecendo em um pipeline - está dentro do while
loop, que tem sua entrada redirecionada da saída do find
comando - então, quando ele lê, está lendo a lista de arquivos find
gerados, e não o terminal. A maneira mais simples que conheço de corrigir isso é enviar a lista de arquivos por algo diferente da entrada padrão, para que a entrada padrão ainda possa ser usada para outras coisas (como confirmação do usuário). Contanto que você não esteja usando o descritor de arquivo nº 3 para outra coisa, isso deve funcionar:
# ...
while IFS= read -r -u3 -d '' FILE; do
# same inside of the loop...
done 3< <(find /etc/init.d/* -name '*service' -print0)
Diz -u3
para read
ler o FD3 e 3< <(find...)
redireciona o FD3 da saída do find
comando. Observe que <( )
(conhecida como substituição de processo) é uma extensão bash (não disponível em shells posix simples), portanto, você só deve usá-la em scripts com os quais você inicia #!/bin/bash
(não #!/bin/sh
).