嵌套 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

相關內容