Синтаксис и примеры for:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Пример for в файле: for variable in list do commands done Пример for в командной строке: for variable in list ; do commands ; done Пример использования for в командной строке: $ ls filemgr.png terminal.png $ for f in *.png ; do mv $f screenshot-$f ; done $ ls screenshot-filemgr.png screenshot-terminal.png |
Синтаксис и примеры if:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
Пример if в файле: if test then commands fi Пример if в файле: if test then commands else commands fi Синтаксис и примеры if: if test then commands elif test2 then commands elif test3 then commands else commands fi Пример использования if в командной строке: $ ls datafile emptyfile $ if [ ! -s datafile ] ; then echo "empty" ; fi $ if [ ! -s emptyfile ] ; then echo "empty" ; fi empty |
Циклы until:
1 2 |
Единственное отличие между циклами while и unti 1 заключается в том, что условие формулируется с противоположной логикой. Следующая команда эквивалентна вышеуказанному циклу while. При этом для формулировки условия i > 5 применяется оператор -gt (больше). |
1 |
i=1; until [ $i -gt 5 ]; do echo $i; i=$[$i+1]; done |
Циклы while:
1 2 3 |
В следующем примере переменной i присваивается значение 1. Потом значение переменной, находящейся в теле цикла между do и done, при каждом выполнении цикла увеличивается на 1, пока не будет превышено значение 5. Обратите внимание, что условия должны указываться в квадратных скобках, как это делалось с условными переходами if, с командой test или с ее сокращенным вариантом. |
Пример 0:
1 |
i=1; while [ $i -le 5 ]; do echo $i; i=$[$i+1]; done |
Пример 1:
1 2 |
Следующий цикл обрабатывает все имена файлов, получаемые после выполнения команды ls *. jpg: ls *.txt | while read file ; do echo "$file" ; done |
Пример 2:
1 2 |
Следующий цикл обрабатывает все имена файлов, проходит по каждому файлу и печатает содержимое файла. ls *.txt | while read file ; do echo "\\n ### \\n ### \\t $file \\n ###" && cat "$file" ; done |
Бесконечный цикл while:
1 2 3 4 5 6 |
#!/bin/bash while : do echo "Press [CTRL+C] to stop.." sleep 1 done |
Бесконечный цикл while:
1 2 3 4 5 6 |
#!/bin/bash while true do echo "Press [CTRL+C] to stop.." sleep 1 done |
Бесконечный цикл показывать время каждую секунду
1 2 |
#!/bin/bash while :;do clear ;date ;sleep 1;done |
Бесконечный цикл меню while:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
#!/bin/bash # Purpose: Display various options to operator using menus # Author: Vivek Gite < vivek @ nixcraft . com > under GPL v2.0+ # --------------------------------------------------------------------------- # capture CTRL+C, CTRL+Z and quit singles using the trap trap '' SIGINT trap '' SIGQUIT trap '' SIGTSTP # display message and pause pause(){ local m="$@" echo "$m" read -p "Press [Enter] key to continue..." key } # set an while : do # show menu clear echo "---------------------------------" echo " M A I N - M E N U" echo "---------------------------------" echo "1. Show current date/time" echo "2. Show what users are doing" echo "3. Show top memory & cpu eating process" echo "4. Show network stats" echo "5. Exit" echo "---------------------------------" read -r -p "Enter your choice [1-5] : " c # take action case $c in 1) pause "$(date)";; 2) w| less;; 3) echo '*** Top 10 Memory eating process:'; ps -auxf | sort -nr -k 4 | head -10; echo; echo '*** Top 10 CPU eating process:';ps -auxf | sort -nr -k 3 | head -10; echo; pause;; 4) netstat -s | less;; 5) break;; *) Pause "Select between 1 to 5 only" esac done |
For-циклы:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
Циклы в bash создаются с помощью трех команд. Команда for осуществляет цикл со всеми элементами указанного списка. Команда while выполняет цикл до тех пор, пока указанное условие не перестанет выполняться. Команда until, наоборот, осуществляет цикл до тех пор, пока указанное условие не будет выполнено. Все три цикла можно досрочно завершить командой break. Команда continue пропускает оставшуюся часть тела цикла и запускает цикл заново. В первом примере переменной i по очереди присваиваются последовательности символов a, b и с. В теле цикла между do и done выводится содержимое переменной. Обратите внимание, что в конце списка, а также в конце команды echo необходимо поставить точку с запятой. Отказаться от этих точек с запятой можно лишь тогда, когда ввод разделен на несколько строк (часто такое случается в сценарных файлах). Список для for может быть построен с использованием джокерных символов для имен файлов или с использованием конструкций вида {..}, с помощью которых создаются последовательности символов. (В Linux/UNIX тильда (~) в конце имени файла обычно означает резервную копию. При работе с командой ср выражение $file всякий раз ставится в кавычках, чтобы имена файлов, содержащие пробелы, обрабатывались правильно.) Если циклы for создаются без in ..., то переменные циклов получают по порядку все параметры, переданные при вызове (то есть это соответствует in $*). Похож на цикл case. Но когда в примере с case передаются имена файлов, содержащие пробелы, без проблем не обходится. Bash интерпретирует пробелы как разделительные знаки и обрабатывает части имени файла отдельно. |
Пример 0 (консоль) for:
1 |
for i in a b с; do echo $i; done |
Пример 0 (скрипт) for:
1 2 3 4 |
#! /bin/sh for i in a b c; do echo $i done |
Пример 1 (консоль(все файлы *. tex копируются в *.tex~.)) for:
1 |
for file in *.tex; do cp "$file" "$file~"; done |
Пример 2 for:
1 2 3 4 5 6 |
#!/bin/bash # Цикл проходит через все # правильно справляется с пробелами в именах файлов for i in "$@"; do ls -l "$i" done |
Пример 3 for:
1 2 |
Выполняется команда ls и формируется список из файлов, дальше выводит содержимое файлов и каждый вывод отделается пустыми строками с #### и именем файла for i in `ls` ;do echo -e "\\n#### $i \\n" && cat $i ;done |
Генерация списков и чисел for:
1 2 3 4 5 |
for((i=1; i< 255; i++));do echo $i; done - генерируем число от 1 до 255 и выводим на экран echo $(( RANDOM % (10 - 5 + 1 ) + 5 )) seq -w 1 10000000000 |
Еще примеры for:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
# ping for ipz in $(for((i=1; i< 255; i++));do echo $i; done) ; do echo 192.168.15.$ipz >> ip_files.txt ; done # ping for pingz in $(cut ip_files.txt); do ping -c1 $pingz ; done # cut file for user in $(cut -d':' -f1 /etc/passwd); do crontab -u $user -l; done # sed edit file for i in file1 file2 file3 ; do sed -i 's/123456/abvgd/g' /home/user/$i; done # grep -R vnc /kvm/$(hostname -s)/*.xml | egrep -o "port='[0-9]+'" | sed -e "s/'//g" | awk -F"port=" '{print $2}' | sort -n # openwrt hostname??? for i in `cat hosts.txt | tail -n 35 | grep -v "#"`; do echo " #### server IP = $i ###" && ssh root@$i uci get system.@system[0].hostname; done # parse MAC for i in `cat hosts.txt | tail -n 39 | grep -v "#"`; do ssh $i ip a | grep ether | awk '{print $2}' && echo ; done # parse MAC print host for i in `cat hosts.txt | tail -n 39 | grep -v "#"`; do ssh $i uci get system.@system[0].hostname && ip a | grep ether | awk '{print $2}' && echo ; done ##parse maccc for i in `cat hosts.txt | tail -n 39 | grep -v "#"`; do ssh $i fdddd="`uci get system.@system[0].hostname`" && echo $fdddd && ip a | grep ether | awk '{print $2}' && echo ; done #scp file for i in `cat hosts.txt | tail -n 39 | grep -v "#"`; do scp bat-hosts root@$i:/etc/bat-hosts; done #scp nameserver 192.168.1.1 for i in `cat hosts.txt.ssh`; do scp resolv.conf ${i}:/etc/resolv.conf; done #test scp resolv.conf for i in `cat hosts.txt.ssh`; do ssh $i cat /etc/resolv.conf; done #rm files for f in log.* ; do if [ ! -s $f ] ; then rm -v $f ; fi ; done |