嵌套 case 语句中不接受用户输入

嵌套 case 语句中不接受用户输入

我正在尝试创建一个嵌套的 case 语句,其中需要用户输入(是/否)。然而,系统从不等待输入,并且总是转到第三个选项,“请回答是或否”。谁能告诉我我错过了什么?

这是案例陈述

 #!/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 读取,并从命令的输出重定向-u3FD3 。请注意,(称为进程替换)是 bash 扩展(在普通 posix shell 中不可用),因此您应该只在开始的脚本中使用它(而不是)。read3< <(find...)find<( )#!/bin/bash#!/bin/sh

相关内容