2014-01-09 2 views
0

У меня есть цикл, который я хочу разбить на любым пользователем.Bash: Захват новой строки с `read`

надуманный пример - таймер, который отсчитывает от 10:

counter=10 
while ((counter > 0)) && [[ -z $input ]]; do 
    printf '\rRestart in %s seconds' "$counter" 
    read -n 1 -t 1 input 
    ((counter--)) 
done 
echo "Completed" 

Это работает надлежащим образом для всех введенных пользователем для Enter за исключением, и я ожидаю, что Enter будет наиболее распространенным вход.

Как я могу взять Enter с помощью команды read от Bash?

+0

Исправлено синтаксис - данный пример кода фактически не работал - а также заставлял его следовать некоторым соглашениям. –

+0

@CharlesDuffy Спасибо! –

+0

Я пропустил что-то важное в своем форматировании/условном исправлении первого шага - не нужно использовать расширение параметра в первом аргументе printf (так как это может привести к недопустимым строкам формата) отсутствующим смягчающим обстоятельствам. Патч это в следующий проход. –

ответ

2

Телль чтения использовать NUL в качестве разделителя:

IFS='' read -r -d '' -n 1 -t 1 input 

Так, в полном контексте:

counter=10; input='' 
while ((counter > 0)) && [[ -z $input ]]; do 
    printf "\rRestart in %s seconds" "$counter" 
    IFS='' read -n 1 -t 1 -d '' input 
    ((counter--)) 
done 
+0

Это ответило так много других вопросов, которые у меня были. Спасибо! –

4

Руководство Баш говорит, что не read возвращает успех (код возврата ноль), если тайм-аута , Итак, как насчет:

for ((counter=10 ; counter > 0 ; counter--)); do 
    printf "\rRestart in %s seconds " $counter 
    read -n 1 -t 1 input && break 
done 
echo "Completed" 
+0

+1 мои мысли точно –

+0

+1 - Это более чистое решение реальной проблемы OP, чем тот, который я предоставил. С другой стороны, на самом деле он не демонстрирует, как захватить новую строку с помощью чтения, и это вопрос, на который может потребоваться тот, кто нажимает на результат поиска для этого, поэтому я склонен называть принятый ответ флаг справедливо награжден. :) –

+0

... несколько незначительных каламбуров, на втором взгляде - 'counter' vs' COUNTER', и это сохраняет плохую практику в предыдущем коде выполнения подстановки строки в строке формата. –

Смежные вопросы