Дата:2012-12-21
Циклы в Bash
Ранее:
1) Изучаем BASH (Основы)
Создадим файл со следующим содержанием:
$ vi for.sh
Пример1
#!/bin/bash
for prm in Roman Viktor Masha "Smirnov Viktor" "Vitek'MO"
MO\'Vitek
do
echo "Name: $prm"
done
echo $prm
Выполним его:
$ sh for.sh
Name:
Roman
Name: Viktor
Name: Masha
Name: Smirnov Viktor
Name: Vitek'MO
Name: MO'Vitek
MO'Vitek
Данный пример показывает нам работы команды For, когда происходит
присваивание переменной PRM следующего значения из списка, т.е. сначало
prm=Roman, затем prm=Virtor и так до конца, пока она не примет значение
последней переменной в нашем случае она будет содержать в себе MO'Vitek.
Если Вы обратили внимание, то что
нужно выводить вместе, необходимо экранировать при помощи " " или \
Возможно так же работать со списком добавляя еще один элемент к списку list=$list" Michel":
Пример2
#!/bin/bash
list="Roman Viktor Masha Dima"
list=$list" Michel"
for prm in $list
do
echo
"Name: $prm"
done
Хороший пример по
мониторингу сети и понимания работы цикла FOR в паре с командой пинг и
статусом выполнения команды.
Пример3
#!/bin/bash
for prm in "192.168.200.3" "192.168.200.65"
do
echo "производим пинг хоста из списка с одним пингом"
ping -c 1 $prm &> /dev/null
# статус выполнения последней команды, если успех тогда 0 иначе идем
дальне
if [ $? -ne 0 ]; then
# В данном случае последняя команда не равно 0
echo "{Хост $prm не пингуется"
echo "`date`: ping не удался, $prm Хост лежит!" | mail -s "$prm Хост не
пингуется!" admin@domain.loc
fi
done
Список Ip даресов хостов, приведенный выше, можно поместить в файл.
Пример4
#!/bin/bash
files="names"
for name in `cat $files`
do
echo "$name"
done
Создать файл names, наполнить его содержимым и проверить
результат.
Пример5
Работа цикла с программой sed по перебору чисел с шагом.
#!/bin/bash
for prm in $(seq 10 10 100)
do
echo prm=$prm
done
Дальше можно продемонстировать работу For с файлами и
каталогами.
Пример6
#!/bin/bash
for prm in /home/aroma/* /home/arg/.* /home/test1/*
do
if [ -d "$prm" ]
then
echo "$prm Это каталог"
elif [ -f "$prm" ]
then
echo "$prm это файл"
else
echo "$prm файл не существует"
fi
done
Произвести разборку файла
#!/bin/bash
IFS.OLD=$IFS
IFS=$'\n'
for
prm1 in `cat /etc/group`
do
echo "Группа: $prm1"
IFS=:
for prm2 in $prm1
do
echo "Реквизит: $prm2"
done
done
Первый цикл - при помощи переменной IFS происходит отделение
каждой новой строки и вывод
Второй цикл For - отделяет все, что за знаком двоеточия и вывод
Пример8
#!/bin/bash
for var1 in 1 2 3 4 5
do
echo "VN $var1"
for var2 in 1 2 3 4 5 6 7 8 9 10 11 12
do
if [ $var2 -eq 6 ]
then
break
fi
echo ".............. $var2"
done
done
В примере 8 видно зваимодействие вложенных циклов с процессом
прерывания во вложенном цикле FOR var2, когда примет значение равное "6"
Пример9
#!/bin/bash
for var1 in 1 2 3 4 5
do
echo "VN $var1"
for var2 in 1 2 3 4 5 6 7 8 9 10 11 12
do
if [ $var2 -gt 3 ] && [ $var2 -lt 9 ]
then
continue
fi
echo ".............. $var2"
done
done > /tmp/for
В примере № 9 представлен пример с командой continue
при помощи которой, в данном примере, происходит прекращение обработки
части команд c перенаправлением в файл.
Пример10
#!/bin/bash
for var1 in c d e a b
do
echo "VN $var1"
for var2 in g f gf fg
do
echo ".............. $var2"
done
done | sort
В примере 10 показано перенаправление в команду "sort", которая
упорядочивает по алфавиту.
Эти циклы, можно сказать, противоположность одно другому.
Так если While служит для повторения команд при условии, что выполение
команды истино (код возврата ноль).
Until действет пока какое-то выражение ложно (Код возврата 1).
Пример
с While.
Пример11
#!/bin/bash
var1=10
while [ $var1 -gt -10 ]
do
echo $var1
var1=$[ $var1 - 2 ]
done
Здесь все очень просто , при том уcловии, что While
выполняется, когда выражение истино тогда:
-gt 0 - Это Пока Var1 Больше -10 уменьшать на 2
В данном примере НЕ Истинность команды будет когда Var1 примет значение
в -10, а до этого все Истино.
Пример12
#!/bin/bash
var1=10
while [ $var1 -gt -10 ]
do
if [ $var1 -eq -8 ]
then
break
fi
echo $var1
var1=$[ $var1 - 2 ]
done
Здесь показан пример с прерыванием "break" в цикле при условии что If
Then станет иснинным когда подойдет к цифре "-8"
Пример с Until.
Пример13
#!/bin/bash
var1=10
until [ $var1 -eq -10 ]
do
echo $var1
var1=$[ $var1 - 2 ]
done
До тех пор пока Var1 примет значение -10 уменьшать на два.
В данном примере истинность команды будет значение принятое Var1 в -10,
а до этого все НЕ Истино.
Далее >>> Передача переменных из командной строки
Количество просмотров: 11292
Комментарии к статье:
Добавить комментарий