<code bash> for i in {100..104}; do action; done for i in 100 101 102 103 104; do action; done for i in $@; do action; done numbers=«1 2 3 4 5» for i in `echo $numbers`; do action; done # Перебор массива, выполнение команды с каждым элементом list=(user1 user2 user3 user4 user5 user6) for i in ${list[*]}; do printf '\n=======%s\n', $i influx -execute 'show grants for '$i';' -username '<auth>' -password '<auth>' done </code> ==== while ==== Выполняется пока условие истинно.
while условие do действие done. В двойных скобках символ $ перед переменной можно опустить, так же, двойные скобки позволяют наращивать значение переменной ( (v+=1) ) <code bash> while [ $v1 -le $v2 ] do <action> done while (( v1 ⇐ v2 )') ; do action; done </code>
Примеры
Бесконечный циклwhile true do echo "--==" $(uname -a) "==--" sleep 2 done
case $v1 in val1) action1;; val2) action2;; *) default action;; esac===== Работа со строками =====
# Длина строки echo ${#string} echo `expr length $string`===== Отладка ===== Для отладки, можно использовать команду bash -x файл_скрипта. ===== Примеры ===== «Около-многопоточность»
Используется минимум два скрипта, в первом выполнение работы, второй в цикле запускает подоболочку в фоне, не дожидаясь окончания каждого. Ньюанс в том что в конце головной скрипт не закрывается сам, думаю можно исправить аргументами.
for CurrAddr in {1..25}; do ./oneping $CurrAddr & # Там происходит просто пинг переданного адреса done # В итоге, ждем тайм-аут один раз, для всех хостов
Случайные значения
**Записать случайные байты в файл**\\ head -c 1024 /dev/urandom > file dd if=/dev/urandom of=file bs=100M count=1 iflag=fullblock # только печатные символы tr -dc 'a-zA-Z0-9' < /dev/urandom | head -c 100M > file # либо base64 вместо tr, только менее гибко по символам base64 < /dev/urandom | head -c 1024 (1K/1M) # ${RANDOM} - возвращает случайное число 0..32К # случайное число от 1..10, (1+ чтобы небыло ноля) $(1 + ${RANDOM} % 10) # Еще так можно диапазон возвращать # 1..5, вернуть одно число $(shuf -i 1-5 -n 1)
Возвращает 0 (истина) или 1 (ложь). Выражения могут быть как унарными так и бинарными.
# Использование test [expr] if test -f file.txt или [ -f file.txt ]; then rm file.txt else echo 'no found' fi # Проверка передачи файла в первом аргументе if (($# < 1)) || [ ! -f ${1} ]; then echo "Config file must be set in the first agrument" exit 1 fi==== Параметры запуска ====
- -d file - если file существует и является директорией.
- -e file - если file существует.
- -f file - если file существует и является обычным файлом.
- -k file - если file существует и ему установлен «sticky» бит.
- -L file - если file существует и является символьной ссылкой.
- -r (-w/-x) file - если file существует и читаем (записываем/исполняем).
- -z str - если длина 0.
- -n str - если длина не 0.
- -a (-o) - аналог && (||) в одинарных скобках.
- str1 = ('!=') str2 - если строки равны (не равны).
Объявляются раньше вызова, нет возможности предобъявления
return возвращает только интовое значение, до 255
===== Примеры =====
Обширный пример
makeimport_sh.doc
Проверка PID
# Такая конструкция сохранит ПИД последнего запущенного процесса в файл & echo $! > file.pid
#!/bin/bash status=2 for i in 1 2 3 do # Для kill нужны права #if kill -0 `cat /path/file.pid` &> /dev/null; if ps -p `cat /path/file.pid` > /dev/null then status=0 break fi sleep 1 done echo "Service status is $status" exit $status
Выполнение скрипта на удаленной машине через SSH
При условии что настроен беспарольный доступ#!/bin/bash ssh username@my-host -p 2444 'bash -s' <<-'ENDSSH' if systemctl is-active --quiet "apache2"; then sudo systemctl stop apache2 sudo systemctl start nginx sudo systemctl status nginx else sudo systemctl stop nginx sudo systemctl start apache2 sudo systemctl status apache2 fi ENDSSHПроверка процессов по списку PID
# Запуск фонового процесса с сохранением PID ($! для фонового процесса) (/usr/bin/sleep infinity &) && (echo $! > pids) for pid in `cat pids`; do if ! ps -p $pid > /dev/null; then echo "exit 1 for pid - $pid" exit 1 fi done