- Примеры Bash скриптов
- Примеры Bash скриптов в Linux
- 1. Первая программа. Модификация команды ‘rm’
- 2. Проверка наличия пути к программе в переменной PATH
- 3. Нормализация вывода даты
- 4. Создание библиотек сценариев
- Заключение
- Оцените статью:
- Об авторе
- 6 комментариев
- Bash скрипты Linux
- Полезные Bash скрипты Linux
- Команды
- Сниппеты Bash
- Выводы
Примеры Bash скриптов
Существует достаточное количество оболочек, например — sh, zsh, ksh и другие. Но мы остановимся на Bash, ведь это самая популярная оболочка среди Linux. Теперь даже Microsoft добавила поддержку Bash.
Эта статья предназначена для тех кто хоть немного знаком с языком сценариев Bash. Давайте рассмотрим некоторые примеры Bash скриптов, которые могут быть полезными в вашей повседневной работе.
Примеры Bash скриптов в Linux
Чтобы посмотреть какой интерпретатор команд у вас используется введите команду:
Как видите у меня установлен именно Bash.
1. Первая программа. Модификация команды ‘rm’
#!/bin/bash
dir=»$HOME/.archive/» # directory for deleted files
if [ -d $dir ]; then # check the directory .archive/
file=»$1″
null=»»
else mkdir $dir | chmod 700 $dir # if there is no, create
fi
if [ $file == $null ]; then # error, if not specified file #
echo -e «/!\ No file.. Usage: $0 filename 😉 | archive directory — $dir /!\ »
exit 1
fi
mv $file $dir$(date «+%H.%d.%m»).$file # move file to .archive/
Все мы знаем что делает команда rm, она удаляет файлы. Эта программа создает папку
/.archive. Далее проверяет задан ли аргумент. Без аргумента программа выдаст сообщение об ошибке и прекратит работу. Если ей передан путь к файлу, она помещает его в директорию
/.archive и добавляет дату(час,день,месяц) в начало имя файла, чтобы мы могли понять когда удалили файл.
Далее я приведу еще несколько программ, но без обяснений. Эти программы можно модифицировать, улучшать как угодно. Попробуйте написать что-то свое.
2. Проверка наличия пути к программе в переменной PATH
#!/usr/bin/bash
in_path() <
cmd=$1 ourpath=$2 result=1
oldIFS=$IFS IFS=»:»
for directory in «$ourpath»
do
if [ -x $directory/$cmd ]; then
result=0
fi
done
IFS=$oldFS
return $result
>
##########
4ck() <
var=$1
if [ «$var» != «» ]; then
if [ «$
if [ ! -x $var ];then
return 1
fi
elif ! in_path $var «$PATH» ; then
return 2
fi
fi
>
##############################
if [ $# -ne 1 ]; then
echo «Usage: $0 command» >&2
exit 0
fi
4ck «$1»
case $? in
0 ) echo «[$1] found in PATH» ;;
1 ) echo «[$1] not found or not executable» ;;
2 ) echo «[$1] not found in PATH» ;;
esac
exit 0
#############################
3. Нормализация вывода даты
#!/bin/bash
monthto() <
case $1 in
1 ) month=»Jan» ;; 7 ) month=»Jul» ;;
2 ) month=»Feb» ;; 8 ) month=»Aug» ;;
3 ) month=»Mar» ;; 9 ) month=»Sep» ;;
4 ) month=»Apr» ;; 10 ) month=»Oct» ;;
5 ) month=»May» ;; 11 ) month=»Nov» ;;
6 ) month=»Jun» ;; 12 ) month=»Dec» ;;
* ) echo «$0: Unknown month value $1» >&2 exit 1
esac
return 0
>
#################
if [ $# -ne 3 ] ; then
echo «Usage: $0 month day year» >&2
echo «Formats are August 3 1962 and 8 3 1962» >&2
exit 1
fi
if [ $3 -le 99 ]; then
echo «$O: expected 4-digit year value.» >&2
exit 1
fi
if [ -z $(echo $1|sed ‘s/[[:digit:]]//g’) ]; then
monthto $1
else
month=»$(echo $1 | cut -c1 | tr ‘[:lower:]’ ‘[:upper:]’)»
month=»$month$(echo $1 | cut -c2-3 | tr ‘[:upper:]’ ‘[:lower:]’)»
fi
echo $month $2 $3
exit 0
4. Создание библиотек сценариев
Библиотеки — это сценарии которые можно включать в другие сценарии.
Такие сценари можно легко включить в другой файл командой source и вызвав нужную вам фунцию.
Заключение
Сегодня мы разобрали несколько примеров Bash скриптов. Узнали как их исползовать в виде библиотечных сценариев. Очень много полезного можно написать на Bash, ограничение тому лишь ваше воображение. Но на самом деле, тема Bash скриптов велика и есть целые книги посвященные этой теме. Надеюсь статья была полезна. Про основы работы с Bash вы можете прочитать здесь.
Оцените статью:
Об авторе
Подсел на Slackware.
6 комментариев
«исползовать» — опечатка, пропущен мягкий знак
Сегодня ничего мы не разобрали.
кроме как узнали что там у нас за интерпретатор а дальше
я просто деранул с нета пару «примеров» но что там я сам не в курсе ребята.
В первом скрипте несколько ошибок и дыр.
1. file и null установлены только если существует директория архива
2. Mkdir | chmod — зачем тут пайп?
3. $dir=»$HOME/.archive» . Mkdir $dir — если в $HOME есть пробел или любой другой спецсимвол, то начнутся спецэффекты.
4. if [ $file == $null ]; если в переданном файле спецсимволы, то получим спецэффекты. Кроме того, условие сработает если нет директории архива.
5. mv $file $dir$(date «+%H.%d.%m»).$file та же ошибка, те же спецэффекты. И ещё одна проблема: если в течение часа мы «удаляем» два файла с одинаковым именем, то бэкап теряется. Проблема становится ещё более интересной в случае директорий.
Вместо второго скрипта можно использовать which или whereis. (этот и следующий на ошибки не проверял). Фунционал третьего скрипта умеет команда date.
круто. зря прочитал
Ну, с нормализацией даты можно и проще, например так: date ‘+%M:%H %e %B %Y’
Разукрашивающая последовательность вида $
В общем-то скрипты для тренировки. А так да, с годами у каждого пользователя Unix-подобных ОС, накапливается порядочное количество скриптов для удобства работы. Я вот, например, всегда забывал, как пересчитывать права файлов в циферки, в rwx и написал тогда это (сейчас уже не использую, т.к. уже запомнилось, что -rwxr-xr-x — это 0755, только из-за редкости использования SUID и SGID ещё путаю):
#!/bin/bash
#
# calcmod
# Calculation of permission
# Author: Serega@Russia
#
############
# Вывод ошибок:
errorka()
<
echo -e «\033[31;1mОшибка аргумента!\033[0m\n»
exit 0
>
#=============#
# Вывод справки:
helpik()
<
echo -en «\033[1m» 1>&2
echo -n ‘calcmod’
echo -en «\033[0m» 1>&2
echo ‘ [аргумент]’
echo ‘ Примеры:’
echo ‘ calcmod 755’
echo ‘ calcmod 0755’
echo ‘ calcmod rwxr—r—‘
echo ‘ calcmod rwsr—r—‘
echo ‘ calcmod rwSr—r—‘
echo ‘ calcmod rwxr—r-T’
echo ‘ calcmod rwxr—r-t’
echo ‘ calcmod П’
echo ‘ calcmod Г’
echo »
exit 0
>
#==============#
# Расчёт из буквенных значений:
calcmod_letter()
<
(( «$len_arg» != 9 )) && errorka
trio_arg=$(echo «$arg» | sed ‘s/^\(. \)\(. \)\(. \)/\1 \2 \3/’)
i=1
bit=0
rwx=»
for trio in $trio_arg
do
n=0
exp_trio_arg=$(echo «$trio» | sed ‘s/\(.\)/ \1/g;s/^ //’)
symb=$(echo «$exp_trio_arg» | cut -d ‘ ‘ -f1)
[ -z $(echo «$symb» | grep ‘[r-]’) ] && errorka
[ «$symb» = ‘r’ ] && n=4
symb=$(echo «$exp_trio_arg» | cut -d ‘ ‘ -f2)
[ -z $(echo «$symb» | grep ‘[w-]’) ] && errorka
[ «$symb» = ‘w’ ] && let n=n+2
symb=$(echo «$exp_trio_arg» | cut -d ‘ ‘ -f3)
[ -z $(echo «$symb» | grep ‘[xsS-]’) ] && (( $i != 3 )) && errorka
[ -z $(echo «$symb» | grep ‘[xtT-]’) ] && (( $i == 3 )) && errorka
if [ «$symb» = ‘x’ ]
then let n=n+1
elif [ «$symb» = ‘s’ ]
then
let n=n+1
(( $i == 1 )) && let bit=bit+4
(( $i == 2 )) && let bit=bit+2
elif [ «$symb» = ‘S’ ]
then
(( $i == 1 )) && let bit=bit+4
(( $i == 2 )) && let bit=bit+2
elif [ «$symb» = ‘t’ ]
then
let n=n+1
let bit=bit+1
elif [ «$symb» = ‘T’ ]
then
let bit=bit+1
fi
let i=i+1
rwx=$(echo «$rwx$n»)
done
mode=»$arg»
print_letter
(( $check_bit != 0 )) && check_calc=1 && bit=’?’
mode=»$bit$rwx»
>
#=============================#
Источник
Bash скрипты Linux
Среди системных администраторов и обычных пользователей Linux достаточно популярна практика писать Bash скрипты для автоматизации и облегчения выполнения определенных задач в операционной системе. Фактически, вы написали один раз порядок действий, которые нужно выполнить, расписали файлы и так далее, а затем просто пишите одну короткую команду и все действия выполняются как нужно. Можно пойти еще дальше и запланировать автоматическое выполнение скрипта.
В этой небольшой статье мы собрали самые полезные Bash скрипты Linux, которые вы можете использовать в своих системах. Некоторые из них состоят из нескольких строк, некоторые помещаются в одну строку. Здесь есть как небольшие сниппеты, которые вы можете использовать в своих скриптах, так и полноценные интерактивные скрипты, для работы с ними через консоль.
Полезные Bash скрипты Linux
Начнем с небольших полезных команд, которые могут пригодиться в различных ситуациях.
Команды
Первый скрипт сортирует содержимое текущей папки по размеру:
du -a -d 1 -h | sort -h
Но в большинстве случаев это не эффективно, вам намного удобнее будет использовать утилиту ncdu. Вам нужно быстро создать пароль и вы не хотите устанавливать pwgen, можете использовать такую команду:
Эта команда запускает простейший HTTP сервер в текущей папке. Очень удобно для отладки чего либо:
python -m SimpleHTTPServer
С помощью команды at можно запланировать выполнение произвольной команды один раз в указанное время, например, в полночь:
echo «ls -l» | at midnight
Скрипт передает звук от вашего микрофона на другой компьютер по ssh. Качество будет очень плохим, но тем не менее это работает:
dd if=/dev/dsp | ssh -c arcfour -C username@host dd of=/dev/dsp
Хотите скачать весь сайт на компьютер для того, чтобы потом иметь возможность просматривать его оффлайн? Для этого достаточно утилиты wget:
wget —random-wait -r -p -e robots=off -U mozilla https://losst.ru
Будут загружены все файлы сайта, включая изображения, игнорированы правила из файла robots.txt и в качестве агента пользователя будет сообщаться Mozilla Firefox. А такой командой можно реализовать самый простой таймер:
time read (ctrl-d для остановки)
Выводит команды bash, которые используются чаще всего:
Такой командой вы можете выводить символы с небольшой задержкой, как в фильмах:
echo «Взлом пентагона. ОШИБКА ОШИБКА» | pv -qL 10
Записать видео с экрана в терминале linux:
ffmpeg -f x11grab -r 25 -s 800×600 -i :0.0 /tmp/outputFile.mpg
Запустит команду через указанный промежуток времени, в данном случае, через 5 секунд:
timeout 5s команда
Удаляет все пустые папки:
find . -type d -empty -delete
Это были самые популярные и полезные команды с точки зрения ресурса commandlinefu.com. А теперь нам нужно рассмотреть сниппеты bash, которые вы можете использовать в своих проектах.
Сниппеты Bash
Допустим, вы хотите засечь сколько времени выполняется определенное действие в вашем Bash скрипте, для этого добавьте там, где нужно начать замер строку:
А там, где нужно прекратить:
END=$(date +%s)
DIFF=$(( $END — $START ))
DIFF=$(( $DIFF / 60 ))
Переменная DIFF будет содержать время выполнения в минутах. Теперь вы можете вывести ее с помощью echo.
Скрипты довольно часто требуют ввода параметров для правильной работы. Этот сниппет позволяет достаточно просто разбирать переданные параметры:
while [ «$1» != «» ];
do
case $1 in
-s ) shift SERVER=$1 ;;
-d ) shift DATE=$1 ;;
—paramter|p ) shift PARAMETER=$1;;
-h|help ) # выведите сообщение с подсказкой
* ) # другие параметры
Тут мы присваиваем значение параметра переменной в зависимости от того какой буквой он обозначен. Например, для такого вызова:
parameter_test.sh -s losst -d 20170916 —parameter Subscribe!
Переменной SERVER будет присвоено значение losst, DATA — 20170916 и PARAMETER — Subscribe. Как это работает? Если кратко, то мы всегда используем первый параметр, и используем команду shift, чтобы сдвинуть стек с параметрами влево, когда текущий первый параметр больше не нужен.
Дальше, если вам нужно убедиться, что важные параметры заданы, можно просто проверить на существование эти переменные:
if [ -z $SERVER ] || [ -z $DATE ]; then
echo «Необходимо указать сервер и дату»;
exit 1;
fi;
Рабочая директория скрипта имеет важное значение, если вам нужно сохранить какие-либо данные в файловую систему. Лучше выполнять команды в правильной директории. Также нужно проверить есть ли у текущего пользователя права на запись в текущую папку. Создайте такую функцию:
# Проверяем существует ли папка
[ -d «$DIR_NAME» ] || <
echo Dir: $DIR_NAME does not exist
exit 1
>
# Проверяем доступ на чтение
[ -r «$DIR_NAME» ] || <
echo Dir: $DIR_NAME not readable
exit 2
>
# Проверяем доступ на выполнение
[ -x «$DIR_NAME» ] || <
echo Dir: cannot cd to $DIR_NAME
exit 3
>
# Проверяем доступ на запись
[ -w «$DIR_NAME» ] || <
echo Dir: $DIR_NAME not writeable
exit 4
>
cd $DIR_NAME
echo «Present directory $DIR_NAME»
>
Затем, чтобы в скрипте безопасно изменить текущую папку на нужную добавьте:
Иногда может понадобится узнать результат работы предыдущей команды. Для этого используйте переменную $?:
if [ $? -ne 0 ]; then
echo «Команда завершена неудачно»;
fi;
Для записи логов с текущим временем и датой создайте такую функцию:
Следующий сниппет используется часто в скриптах, которые зависят от состояния других системных процессов. Например, может понадобиться убедиться, что MySQL отключен прежде чем выполнять определенные действия.
Теперь вернемся к нашему примеру с MySQL и используем только что написанную функцию:
check_process mysql;
CHECK_RET=$?;
if [ $CHECK_RET -ne 0 ];
# если процесс запущен
else
# если процесс не запущен
fi;
Иногда может понадобиться загрузка значений переменных из файла. Сначала создаем файл с переменными:
Затем просто добавьте такую строку вначале скрипта, при условии, что конфигурационный файл находится в этой папке и называется configfile:
Значения будут загружены в переменные $key1 и $key2. Если нужно перебрать все файлы в текущей папке или файлы, по определенному шаблону, используйте такой цикл:
#!/bin/bash
PATH=/path/to/dir/FILES=*.sql
for f in $PATH$FILES
do
# Что-то делаем с каждым файлом $f
done
Следующую функцию вы можете использовать для отправки email сообщений из ваших скриптов. Все что нужно, это указать текст сообщения, тему и список адресов получателей. Вот сама функция:
sendEmail() <
echo $content | mail -s «$subject» $email_list exit;
>
Выводы
В этой статье мы рассмотрели полезные bash скрипты linux, которые вы можете использовать при работе с системой. Сначала мы разобрали несколько полезных комбинированных команд, а затем несколько полезных снипетов. Если вы хотите более детально разобраться в создании скриптов, смотрите статью написание скриптов на Bash.
Источник