Выйти из цикла, если нажата клавиша

393
BOUABANE Raed

Я хочу выйти из скрипта, если нажата какая-либо клавиша.

#!/bin/sh while true; do df -h | head sleep 10 clear done 

Любое предложение?

0

3 ответа на вопрос

0
kai-dj

Заменить sleep 10;наread -t 10 -n 1 exitwhile; if [ -n "$exitwhile" ]; then break; fi

read -t 10 -n 1 exitwhileожидает ввода в течение 10 секунд без подтверждения нажатием клавиши enter и помещает ввод в переменную exit. если эта переменная не пуста, цикл while прервется.

… Должен быть изменен, потому что он сломается только на символьных клавишах

0
oliv

Вам лучше использовать watchкоманду:

watch -n10 'df -h | head' 

Используйте Ctrl+, cчтобы остановить команду.

На watchстранице руководства написано:

watch - периодически запускать программу, показывая вывод в полноэкранном режиме

Вы можете Ctrl + C оригинальный скрипт. Дело в том, чтобы использовать * любой * ключ. Kamil Maciorowski 5 лет назад 0
0
Kamil Maciorowski

Это выйдет практически на любую клавишу:

#!/bin/bash while true; do { clear; df -h | head; } </dev/null read -n 1 -t 10 && break done; read -t 0.1 -n 1000000 

Заметки:

  • Шебанг зовет bash, не shиз-за read -n.
  • Перенаправление от /dev/nullдолжно предотвратить команды, отличные readот исчерпания стандартного ввода ( clearи dfможет не делать этого, но в общем случае команды могут). Таким образом, любой вклад идет в readконце концов.
  • Финал read- отбросить лишние символы из stdin. Некоторые ключи генерируют более одного символа (исследуйте «escape-последовательности»); Также можно нажимать несколько клавиш во время работы df(или любой другой команды, которую вы хотите использовать). Без финала readэти лишние символы засорят вашу командную строку.

Альтернативный подход, с watch:

#!/bin/bash watch -n 10 df -h & # put to the background read -n 1 kill $! # kill the the job most recently placed into the background read -t 0.1 -n 1000000