Если вы хотите делать чтолибо несколько раз, вам нужен цикл. В bash есть три вида циклов: for, while и until.
Красивый и удобный цикл for имеет следующий синтаксис:
for аргументы in список do
команды done
Он выполняет действие команды (которое может покрывать такое количество строк и отдельных команд, какое вам угодно), указанное между do и done для каждой единицы в списке. Когда команды выполняются, они могут получать доступ к актуальной единице из списка посредством переменной $аргумент. Поначалу синтаксис может запутать: в операторе for вы должны указать аргумент без знака доллара, но в командах вы должны указать $аргумент со знаком доллара.
Рассмотрим несколько простых примеров:
admin@serverl:$ for stooge in moe Tarry curly
> do
> echo $stooge
> done
moe
larry
curly
admin@serverl:~$ for file in *
> do
> Is 1 $file
> done
rwrr1 admin admin 48 20060826 14:12 hello admin@serverl:$ for file in $(find / name \*.gif)
> do
> cp $file /tmp
> done
Цикл whi 1 e работает, пока выполняется условие:
while выражение do
компоненты done
Здесь находится образец сценария, использующего арифметические выражения, указанные выше для создания Собразного цикла while (структура кода необязательна, но нам она нравится):
((cur=l)) # Считываем cur как переменную типа integer while ((cur < MAX)) do
echo n "$cur "
((cur+=l)) # Инкремент значения типа integer done
Цикл unti 1 противоположен whi 1 е. Он выполняется до тех пор, пока условие не станет истинным:
until выражение do
компоненты done
Рассмотрим пример:
until [[ Scmd = Sgameover ]] do
echo n "Your command (Sgameover to quit)? " read cmd
if [[ $cmd !Sgameover ]]; then Scmd: fi done
Для выхода из цикла используйте оператор break. Перепишем наш цикл until в цикл whi 1 е с командой break:
echo n "Your command (Igameover to quit)? " read cmd
if [[ Icmd == Sgameover ]]: then break: fi
$cmd
done
Для пропуска остатка тела цикла и перехода обратно к его началу используйте команду continue:
echo n "Your commmand ($gameover to quit)? " read cmd
if [[ $cmd != Sgameover ]]: then $cmd; continue: fi
break
done