Linux: программирование в bash (полезные скрипты, функции, условия, циклы, case)

Пользовательский ввод

Bash read user input

read -p "Enter var: " var
echo "$varv"
Условия

Сравнение строк.

Нулевая строка.

if [[ $var == "" ]]; then
echo "choto"
fi

Сравнение численных в bash:

https://stackoverflow.com/questions/18668556/comparing-numbers-in-bash
if (( $delay > 900 )); then
echo "lol"
fi

if [[ "$delay" -gt "900" ]]; then
echo "lol"
fi
CASE

Пример из configure netmap (автоселект ОС):

#!/bin/sh

os=$(uname -s)
topdir=$(cd $(dirname $0); pwd)

case $os in
Linux)
$topdir/LINUX/configure "$@";;
FreeBSD)
$topdir/FreeBSD/configure "$@";;
*)
echo "Sorry, $os is not supported"
exit 1;;
esac
Функции
select_res() {
grep $1 $2
}

select_res  $1 $2

 

СКрипты
скрипт по мониторингу процесса/изменения файла

Простейший однострочный скрипт, который позволяет онлайн (апдейт каждую секунду) следить за изменением процесса/файла и проч.

while true; do ps -aux | grep apache; echo; sleep 1; done
скрипт по поиску строк одного файла в другом файле
  • Файл из которого берем строки для поиска указываем в первой переменной.
  • Файл в котором делаем поиск указываем во второй переменной.

Можно убрать якоря, чтобы успешный результат считался не только по полному match строки.

usage:
./str_existance.sh to_find.txt where_find.txt

code:
#!/bin/bash
cat $1 | while read sw

do

 RESULT=$(grep ^"$sw"$ $2)
 if [[ "$RESULT" == "" ]]; then
   echo $sw";"not_exist
 else
   echo $sw";"exist
 fi

done
скрипт по генерации списка IP

Простой скрипт по генерации большого количества IP адресов на базе стартового адреса и необходимого количества адресов (в примере 100к):

usage:
generate_range.sh 7.7.7.1 100000

code:
#!/bin/bash ip1=$(echo "$1" | awk -F'.' '{print $1}') ip2=$(echo "$1" | awk -F'.' '{print $2}') ip3=$(echo "$1" | awk -F'.' '{print $3}') ip4=$(echo "$1" | awk -F'.' '{print $4}') limit=$(echo "$2") count=0 for a in $(seq $ip1 255); do for b in $(seq $ip2 255); do for c in $(seq $ip3 255); do for d in $(seq $ip4 255); do if [[ $count == $limit ]]; then exit fi echo "$a.$b.$c.$d" let count++ done done done done
скрипт по генерации списка портов на основе диапазона или последовательности

Набросал скрипт по генерации списка портов на основе диапазона или последовательности. Ест любые известные мне комбинации, использовал для многих кейсов после получения списка из конфига/консоли. Для генерации из диапазона используется подвызов eval.

#!/bin/bash
echo "$@" | sed 's/,/ /g' | tr " " "\n" | sed 's/[[:space:]]//g' | grep '[0-9]' | while read port
do
RANGE_DETECTION=$(echo $port | grep "-")
if [[ "$RANGE_DETECTION" == "" ]]; then
 echo $port
else
 port=$(echo $port | sed 's/-/../')
 echo `eval echo {$port}` | tr " " "\n"
fi
done

Usage:

$ port_list_from_range 1 
 1

$ port_list_from_range 10-11,13-14
 10
 11
 13
 14

$ port_list_from_range 10-11,13-14 23,24-28
 10
 11
 13
 14
 23
 24
 25
 26
 27
 28

Leave a Reply