скрипт пропускает пользовательский ввод во вложенном случае

Я пытаюсь создать вложенный оператор case, в котором ожидается ввод пользователя (Y / N). Однако система никогда не ждет ввода и всегда переходит к третьему варианту: «Пожалуйста, ответьте« да »или« нет ».

Вот пример case

#!/bin/bash
STATUS=status

find /etc/init.d/* -name '*' -print0 | while IFS= read -r -d '' FILE;
do
if [ "$FILE" != "." -o "$FILE" != ".." ]; then
OUTPUT=$($FILE $STATUS)
case "$OUTPUT" in
    *disabled* )
        echo "Do you wish to start $FILE ?"
        read  yn
        case $yn in
         [yY] | [yY][Ee][Ss] )
                $FILE start
                ;;
         [nN] | [n|N][O|o] )
                ;;
        * )
        echo "Please answer yes or no.";;
        esac
        ;;
       * )
        echo "App $FILE is running"
;;
esac
fi
done

Запуск под Ubuntu 14.04 LTS

Пример вывода

[ f2]
1
задан 26 June 2014 в 17:44

2 ответа

Контекст на этот раз дает ответ. Вы обрабатываете вывод find во весь цикл while, и это включает в себя также ваше внутреннее чтение ... что означает, что ваш «read yn» также будет считываться с того же самого вывода, что и «find», в отличие от вашего клавиатура.

Мне также не нравится ваша общая обработка циклов над файлами. Простой:

for file in /etc/init.d/*; do
   echo Processing $file
done

обычно хорошо работает в наши дни даже для больших объемов файлов.

Если вы действительно должны использовать find, возможно, вы можете обернуть обработчик внутри другого скрипта и вызовите его для каждого файла с помощью:

find /etc/init.d -type f -perm +111 -exec myhandlerscript.sh {} \;

Это найдет все файлы с исполняемыми разрешениями и вызовет myhandlerscript.sh для каждого из них с именем в качестве аргумента. В скрипте имя файла появится внутри специальной переменной $ 1.

Если это действительно должно быть в одном файле, оберните код внутри функции, экспортируйте его с помощью «export -f myfunction» и используйте «-exec bash -c» myfunction «$ 0» '{} \; " в качестве параметра для поиска.

2
ответ дан 24 May 2018 в 06:17

Ваше использование команды «читать» кажется не совсем правильным.

read -p "Do you wish to input data ?" yn

. Переключатель -p ожидает строку рядом с ней, которая будет использоваться в качестве подсказки. Таким образом, он считал, что «yn» - это что-то отображаемое, а не переменная для хранения ответа.

1
ответ дан 24 May 2018 в 06:17
  • 1
    При этом не будет необходимости в echo -n "Do you wish to input data ?", иначе он будет показывать это дважды. Альтернативой было бы просто иметь read yn без опции -p, которая вызывает проблему. – Wilf 26 June 2014 в 13:44
  • 2
    @Wilf, я попробовал оба, так или иначе оба не работают. Он всегда прыгает с входа. Обновлен с полным сценарием, который я пытаюсь создать. – Ubuntuser 26 June 2014 в 13:54
  • 3
    Пропускает ли это эхо, или просто читает? Неужели он даже входит в «отключен»? ветвь случая? – Whyte 26 June 2014 в 17:22
  • 4
    @Whyte: Да, это так. Выход, который я получаю: App /etc/init.d/reboot is running App /etc/init.d/resolvconf is running App /etc/init.d/rsync is running App /etc/init.d/rsyslog is running App /etc/init.d/samba is running App /etc/init.d/samba-ad-dc is running Do you wish to start /etc/init.d/saned ? Please answer yes or no. – Ubuntuser 26 June 2014 в 17:43

Другие вопросы по тегам:

Похожие вопросы: