Иногда возникает необходимость выполнять какое-либо действие несколько раз. Можно написать инструкции несколько раз, но можно создать цикл, который будет выполняться несколько раз и в процессе каждого выполнения будут исполняться определённые инструкции.
Например, нужно показать пользователю большое количество сообщений или провести несколько одинаковых тестов.
Для создания цикла можно воспользоваться оперетором while.
While– позволяет создавать циклы. В баше, для создания циклов можно также использовать операторы for и until, но о них позже.
В данном посте я расскажу о нескольких скриптах.
Первый скрипт генерирует ряд чисел:
~/tst-shell/v20.30$ bash v20.30-while_loop.sh
1
2
3
4
5
6
7
8
9
10
Как видно, появились числа от одного до десяти. Можно создать скрипт в котором будет вызвана команда echo и она напечатет эти десять чисел, а не создавать никакой цикл – о котором я сегодня говорю.
Но это подходит только для очень простых задач или задач с заранее известным результатом. Я этого говорю потому что не все задачи требуют использования глубоких познаний в программировании, можно их решать примитиными и надёжными методами.
Но я сегодняшняя тема – циклы while.
Итак, из чего состоит скрипт?
#while loop in action
count=1
while [ $count -le 10 ]
do
echo $count
count=$(($count+1))
done
exit 0
В данном скрипте есть оператор цикла while. Он начинается с контролького слова while и условия в квадратных скобках. Цикл будет выполняться до тех пор пока условие в квадратных скобках верно. Данное условие проверяется каждый раз перед выполнением тела цикла. Тело цикла заключается между do и done. В процессе выполения тела цикла выводится текущее значение переменной count, после чего значение переменной увеличивается на единицу. После выполнения всех инструкций находящихся в теле цикла, интерпретатор проверяет условие цикла ещё раз. Если условие верно, то цикл выполняется ещё раз, если нет, то происходит выход из цикла и продолжается выполнение других инструкций скрипта.
Второй скрипт – Packetloss tests:
~/tst-shell/v20.30$ bash v20.30-4-while_ping-till_time.sh
Please, enter exact time, till which should ping test be made. Format HoursMinutes, like 1439.
1607
ping test #1
Current time is 16:06:55
host= ya.ru
packet_loss= 0
ping test #2
Current time is 16:06:59
host= ya.ru
packet_loss= 0
ping test #3
Current time is 16:07:03
host= ya.ru
packet_loss= 0
Packet loss was 0 %
Сам скрипт(подробности смотри в видео):
~/tst-shell/v20.30$ cat v20.30-4-while_ping-till_time.sh
#while loop and ping test
clear
packet_loss=0
tilltime=0
currenttime=0
i=0
temp_avarage_packetloss=0
avarage_packetloss=0
echo "Please, enter exact time, till which should ping test be made. Format HoursMinutes, like 1439."
read tilltime
currenttime=$(date +%H%M)
while [ $currenttime -lt $tilltime ]
do
currenttime=$(date +%H%M)
i=$(($i+1))
echo "ping test #$i"
echo "Current time is `date +%H:%M:%S`"
packet_loss=$(ping -c 5 -q ya.ru | grep -oP '\d+(?=% packet loss)')
echo "host= ya.ru"
echo "packet_loss= $packet_loss"
echo ""
temp_avarage_packetloss=$(($temp_avarage_packetloss+$packet_loss))
done
avarage_packetloss=$(($temp_avarage_packetloss/$i))
echo "Packet loss was $avarage_packetloss %"
exit 0
Вычисление среднего значения – Calculating an average:
~/tst-shell/v20.30$ cat v20.30-while-score.sh
#!/bin/bash
# Calculate the average of a series of numbers.
SCORE="0"
AVERAGE="0"
SUM="0"
NUM="0"
while true; do
echo -n "Enter your score [0-100%] ('q' for quit): "; read SCORE;
if (("$SCORE" < "0")) || (("$SCORE" > "100")); then
echo "Be serious. Common, try again: "
elif [ "$SCORE" == "q" ]; then
echo "Average rating: $AVERAGE%."
break
else
SUM=$[$SUM + $SCORE]
NUM=$[$NUM + 1]
AVERAGE=$[$SUM / $NUM]
fi
done
echo "Exiting."
Скрипт – бесконечный цикл:
:~/tst-shell/v20.30$ cat v20.30-while-infinite-loop.sh
#!/bin/bash
while :
do
echo "infinite loops [ hit CTRL+C to stop]"
sleep 0.5
done
Подробнее смотрите в моём видео.
На сегодня всё, спасибо за внимание, надеюсь вам понравилось. =)
Подписывайтесь на канал!
Удачи!
Sources:
youtube
opennet
http://open-life.org/blog/bash/299.html
9.2.2.4. Calculating an average
How do I use while as infinite loops?