Я пытаюсь создать вложенный оператор 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]Контекст на этот раз дает ответ. Вы обрабатываете вывод 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» '{} \; " в качестве параметра для поиска.
Ваше использование команды «читать» кажется не совсем правильным.
read -p "Do you wish to input data ?" yn
. Переключатель -p ожидает строку рядом с ней, которая будет использоваться в качестве подсказки. Таким образом, он считал, что «yn» - это что-то отображаемое, а не переменная для хранения ответа.