2014-09-10 6 views
1

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

#!/bin/bash 
declare -i sum=0 
declare -i count=0 

while [ $count -lt 5 ]; do 
read addition 
let sum=sum+addition 
let count++ 
done 
echo "$sum" 

Какие в основном суммирует вместе на вход прочтении 5 раз. Вместо этого я хочу, чтобы это делалось, пока я не использую конкретное нажатие клавиши, например ctrl + d. Ниже приведен код (очевидно, отсутствует код мне нужно зарегистрировать нажатие клавиши, а затем разорвать петлю) Я хочу:

#!/bin/bash 
declare -i sum=0 

while true; do 
read addition 
let sum=sum+addition 
if [ ]; then #what should I insert, do I need additional lines to register keystrokes? 
break; 
fi 
done 
echo "$sum" 

Пожалуйста, не стесняйтесь, поправьте меня, если что-то кажется неправильным, а также - это мой самый первый пост на stackoverflow, на самом деле. Спасибо!

ответ

1

Лично я хотел бы написать, что вы пытаетесь сделать так:

#!/bin/bash 

sum=0 
count=0 
while read -r addition && ((++count < 5)); do 
    ((sum += addition)) 
done 
echo "$sum" 

Это будет прекращено после того, как 5 считывает или когда код выхода read отличное от нуля (a Ctrl - d сделаю это).

Пар точек на то, что вы сделали:

  • Там нет необходимости использовать declare -i, особенно, когда вы инициализацию переменного при объявлении его (но я думаю, нет также никакого вреда в этом)
  • let является старым синтаксисом bash, вы можете (и должны) использовать более актуальную информацию (()). В качестве альтернативы вы можете использовать более широко совместимый (совместимый с POSIX) sum=$((sum+1)).
+0

Хорошо, спасибо. Я буду замечать синтаксис declare -i и (()). – Superdids

+0

Нет проблем. Кстати, если вам не нужны какие-либо дополнительные разъяснения, вы должны принять свой любимый ответ (не обязательно этот!), Поэтому ваш вопрос будет отмечен как решенный. –

+1

Использование 'declare -i sum' позволяет вам написать' sum + = дополнение', не упаковывая его в арифметическую команду. Не лучше или хуже, просто разные. – chepner

0

Итак, если вы ищете способ выйти из цикла, как только вы ввели все числа, которые вы хотите суммировать, вы можете использовать команду trap.

Если вы новичок в программировании bash, это команда, которая будет захватывать сигналы (например, Ctrl + c) и вызывать выполнение другой процедуры. В этом случае вы, вероятно, выполните команду break -type.

+0

Я посмотрю на человеческую ловушку, тогда, спасибо! – Superdids

0

Вы не хотите использовать ctrl+d, что означает по существу EOF или «no more input», из-за чего ваша оболочка будет отключена. Как вы нашли, большинство сигналов используется с kill и требует использования функции trap, которую вы не хотите здесь. (вы можете использовать ловушку, но это закончит ваш скрипт). Почему бы не воспользоваться тем фактом, что переменные не являются typed в bash и просто выбирают какое-то значение или слово для выхода из цикла? Ваш первый сценарий может быть отредактирован, чтобы обеспечить:

#!/bin/bash 
declare -i sum=0 

while read addition; do 
    [ "$addition" = "done" ] && break 
    let sum=sum+addition 
done 
echo "$sum" 

При выполнении сценария вручную, когда вы закончите, просто введите «сделано» или что вы выбрали. Пример:

$ ./script.sh 
10 
10 
10 
15 
done 
45 

Сценарий будет автоматически выйти и обеспечить sum, если вы предоставите файл с номерами на него cat для стандартного ввода. Например. (Файл с одинаковыми номерами на разных строках):

$ cat somefile.txt | ./script.sh 
45 
+0

ctrl + d было в основном предложением, просто найти подходящий ключ в качестве примера не так просто быть неопытным в bash-программировании!И да, я бы сам, просто использовал значение, чтобы сломать цикл - на самом деле мне было любопытно. – Superdids

+0

Ты в хорошей компании. Я делал это в течение многих десятилетий, и захват ключа для завершения ввода в bash всегда требует креативного исправления. Любой из сигналов, которые вы могли бы генерировать, например. SIGHUP, SIGINT и т. Д. Потребует захвата и управления с помощью 'kill'. Вместо «сделанного» сделать его столицей 'C' - по крайней мере, вы почувствуете захват сигнала :) –

+0

Ницца, спасибо! Мне теперь нужно читать и кодировать, кажется, что ^^ – Superdids

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