Показаны сообщения с ярлыком bash. Показать все сообщения
Показаны сообщения с ярлыком bash. Показать все сообщения

5 нояб. 2019 г.

Онлайн эмуляторы терминала Linux и редакторы Bash

Источник

Learnshell

Это интерактивная среда, в которой вы можете одновременно изучать программирование оболочки и редактирование кода с помощью интерпретаторов оболочки Unix / Linux. Проанализировать и пройти обучение можно на сайтеhttp://www.learnshell.org/

Codeanywhere

Хотя Codeanywhere является платным сервисом, он по-прежнему предоставляет бесплатный план с виртуальной машиной Linux, где вы можете настроить контейнер с операционной системой по вашему выбору. Если вы выберете Linux, то на коленях у вас будет консоль Linux для изучения команд. Более того, если вы стремитесь получить интегрированные межплатформенные облачные интегрированные среды разработки онлайн, то Codeanywhere будет лучшим местом для начала.

Сайт для ознакомления https://codeanywhere.com/login

Linux Containers

Этот проект поддерживается Canonical и считается одним из лучших онлайн-терминалов Linux, который предоставляет демонстрационный сервер на 30 минут для изучения основных команд Linux. Зайдите на сайт https://linuxcontainers.org/lxd/try-it/

Rextester

Является простым, легким и надежным онлайн-редактором и компилятором bash. Он также поддерживает другие основные языки программирования.

Обучайтесь на этом сайте https://rextester.com/l/bash_online_compiler

Webminal

Лучший для начинающих. Это впечатляющий онлайновый Linux-терминал, когда речь идет об обучении Linux-командам и сценариям для начинающих онлайн. Это бесплатная обучающая платформа GNU / Linux Online Terminal для практики команд, создания и доступа к таблицам MySQL, написания сценариев оболочки и bash, изучения программирования на Python и выполнения задач пользователя root.

Создайте свою учетную запись для использования этого онлайн терминала на сайтеhttp://www.webminal.org/register/

JS / UIX

Это онлайн-терминал Linux и виртуальная машина, которая предоставляет среду, в которой вы можете изучать и тестировать различные команды Linux, сценарии оболочки и управление файловой системой. Он полностью написан на JavaScript без каких-либо плагинов.

Вы можете им воспользоваться на сайте https://www.masswerk.at/jsuix/index.html

CB.VU

Представляет собой Unix-подобный интерфейс командной строки виртуальной оболочки, где вы просто пробуете команды Linux и получаете вывод. Здесь нет ничего необычного или раздутого с некоторыми дополнительными функциями, которые вам вообще не нужны.

Обучайтесь командам здесь http://cb.vu/

Copy.sh

Быстрый и надежный онлайн-терминал, лучший для Linux, доступный для тестирования и практики команд на основе Linux или Unix. Это легкий и быстрый инструмент, который активно поддерживается в GitHub . Copy.sh поддерживает различные платформы, включая Archlinux, FreeDOS, KolibriOS, Windows 98, Windows 1.0, ReactOS

Используйте этот сайт https://copy.sh/v86/?profile=linux26

Paiza.io

Полезный веб-сайт, на котором вы можете попрактиковаться в различных языках кодирования и написания сценариев, включая сценарии bash или shell для свободного доступа. Он также предлагает онлайн-терминал Linux на своей облачной платформе.

https://paiza.io/en/projects/new?language=bash

ShellCheck

Это инструмент статического анализа сценариев оболочки. Является удивительным онлайн-инструментом, созданным для bash, который выдает предупреждения и предложения для сценариев оболочки bash / sh. Он хорошо поддерживается на GitHub и поддерживает все основные платформы ОС, включая Debian, Arch Linux, Gentoo, FreeBSD, OS X, Windows

Для использования перейдите по этой ссылке https://www.shellcheck.net/#

JDOODLE

Еще один онлайновый кроссплатформенный облачный центр сбора IDE. Если вы ищете онлайн-редактор Bash, то вы должны попробовать онлайн-редактор Bash JDOODLE. Вы можете выполнять различные скрипты bash и мгновенно получать результат.

Перейдите по указанной ссылке https://www.jdoodle.com/test-bash-shell-script-online

LinuxZoo

Несомненно это интересный эмулятор онлайн-терминала, где вы можете изучать и практиковать основные команды Linux. Это онлайновый Linux-терминал на основе Python, в первую очередь предназначенный для начинающих. Помимо отработки базовых команд Linux, вы также можете экспериментировать и проверять игры с богатой производительностью в LinuxZoo.

https://linuxzoo.net/

JSLinux

Это один из лучших онлайн-комбо-пакетов для Linux-терминалов, предлагающий вам полноценную онлайн-систему Linux на основе консоли или графического интерфейса. Он написан на языке программирования JavaScript. Это полный эмулятор Linux, где вы можете загружать файлы в виртуальную систему и практиковать команды Linux. JSLinux использует Buildroot в своей основе, что в конечном итоге поможет вам создать полноценную систему Linux для любых встроенных устройств.

Для работы на нем зайдите на этот сайтhttps://bellard.org/jslinux/

Tutorialspoint

Предоставляет все в одной платформе кодирования. Это один из всех онлайн-центров по программированию и командам, где вы получите весь ресурс в более чем 75 языках программирования. Вы получаете онлайн-терминал Unix, онлайн-терминал Ipython, онлайн-терминал MySQL, онлайн-терминал Linux, онлайн- редактор LaTeX и все остальное.

Перейдите на сайт https://www.tutorialspoint.com/codingground.htm

Gnome Terminal

Это хорошо интегрированный эмулятор терминала для среды рабочего стола Gnome. Он имеет облачную версию на rollApp, где вы можете практиковать команды оболочки Unix и Linux. Для работы с онлайн эмулятором перейдите по указанной ссылке https://www.rollapp.com/app/gterminal

20 июл. 2000 г.

Язык bash часть 9

Язык командного интерпретатора bash. Part 8. «Обработка сигналов и протоколирование»

И настал, наконец, черёд восьмого топика о командном интерпретаторе bash. Им я завершаю свой цикл статей. Сегодня будет рассмотрена обработка сигналов в bash и протоколирование. Данный топик, также как и предущий, будет небольшим в связи с прямо пропорциональной зависимостью от объёма информации.
Возможности bash позволяют перехватывать и обрабатывать сигналы с помощью сценария. Под сигналами понимается средство, позволяющее сообщать процессам о различных событиях в операционной системе.
Список всех сигналов можно получить, введя команду:

$ kill -l

Перехватывать сигналы позволяет команда trap. Общий синтаксис команды:
trap [-lp] [команды сигнал сигнал …]

Ключ –l выводит список имён и номеров сигналов, а ключ –p выводит список команд, связанных с каждым сигналом. Сигналы следует указывать по именам либо по номерам.
Система всегда каким-либо образом реагирует на получение сигнала, то есть выполняет команду. Если же вместо команды указать пустую строку, то сигнал просто будет проигнорирован.
Приведу небольшой список наиболее часто встречающихся сигналов:
HUP – hangup, отбой;
INT – interrupt, прерывание;
QUIT – выход;
ILL – illegal instruction, программная ошибка;
FPE – floating point exception, вычислительная ошибка;
KILL – убить процесс;
TERM – termination, завершить процесс;
CHILD – завершился дочерний процесс.
Пример:

trap '' INT #игнорировать сигнал INT

Для того, чтобы протоколировать процесс работы своего скрипта, нужно использовать команду tee. Команда копирует данные из своего стандартного потока ввода и раздваивает их на стандартный поток ввода и в указанный файл лога. Для пояснения приведу пример:
$ cat listfile* | sort | tee check.file | uniq > result.file

Здесь, в файл check.file будут записаны данные из всех «listfile*», в отсортированном виде до того, как повторяющиеся строки будут удалены командой uniq.
Также существует другой способ протоколирования. Он заключается в использовании команды script, которая копирует в файл весь сеанс работы в текстовой консоли: ввод пользователя и вывод команд. Если производить запуск команды script вручную, то остановить протоколирование можно командой exit.
Приведу пример:

LOGFILE=logif [ "$LOGGING" == "true" ]; then
script myscript $LOGFILE; else
myscript;
fi

Для того, чтобы вызвать сценарий внутри своего сценария, нужно использовать команду exec:
exec script $0 $LOGFILE

===================Добвка из комментов=====================
Добавка:
1)Сигналы:
HUP – hangup(требуется переподключение, многие службы получив этот сигнал перечитывают свой конфиг);
INT – interrupt, прерывание с клавиатуры(что делать при нажатие Ctrl-C);
KILL – убить(безусловно — нет шанса отказатся умерать) процесс;
TERM – termination, завершить процесс — просьба процессу умереть;
STOP — застопить процесс (безусловно — нет шанса отказатся)
CONT — продолжить выполнение застопленного процеса

2) А еще есть: killall и xkill

3) У команды tee есть опция -a — означает append — то есть если указанный файл-логов существует то его не перезаписать. а дописывать в него

4) А про script — её часто просят запустить техподдержка в случае какой-нить проблемы и затем выполнить стандартный набор команд по списку, которые собирают информацию по системе — и затем прислать им собранный script'ом файл.

Язык bash часть 8

Язык командного интерпретатора bash. Part 7. «Функции»


Вот и наступил черёд седьмого топика цикла о языке командного интерпретатора bash. В некотором роде число «7» является везучим, как говорят в народе. Надеюсь, и меня не обойдёт данная примета.
Сегодня будут разобраны такие конструкции языка bash, как функции. Надеюсь, тебе не нужно рассказывать о том, что такое функция и для чего она применяется, ведь её смысл эквивалентен понятию функции из любого другого языка программирования. Объём информации сегодня не большой, поэтому пост имеет довольно скромные размеры. Итак, приступим к непосредственному разбору функций в bash.
Общий синтаксис оператора определения функции:

[function] имя_функции () {
список_комманд
}

Кроме K&R-стиля также применим BSD-стиль:

[function] имя_функции ()
{
список_комманд
}

Вызвать функцию можно в любом месте сценария, но перед этим она должна быть объявлена. Вызов осуществляется указанием имени функции в тексте скрипта.

#определение функции
func1 () {
  echo "Hello."
} #вызов функции
funс1

Функции принимают входные аргументы и возвращают код завершения. Доступ к входным аргументам осуществляется через позиционные параметры. Позиционный параметр 0 содержит имя функции. Внутри функции доступны локальные переменные сценария. Приведу пример:
param1=Hello
func2 () {
param2=${1-$param1}
echo "param2 = $param2"
}

Теперь пример с аргументами:
func3 () {
if [ "$1" ]
then
echo "Аргумент #1: \"$1\".-"
fi
if [ "$2" ]
then
echo "Аргумент #2: \"$2\".-"
fi
}
func3 #вызов функции без аргументов
func3 arg1 #вызов функции с одним аргументом
func3 arg1 arg2 #вызов функции с двумя аргументами

Если при выполнении функции произошла ошибка, происходит завершение выполнения функции с ненулевым кодом возврата. Код завершения можно задавать явно с помощью команды return. Код завершения в сценарии может быть получен через переменную $? и доступен до выполнения следующей команды.
Возможности bash позволяют переопределить stdin для функции, чтобы получать входные данные из файла. Для этого служит конструкция:

имя_функции ()
{
список_команд
} < файл
Также возмож
ен следующий вариант:
имя_функции ()
{
{
список_команд
} < файл
}
==========Добавка из коментов=====================
Пример1
Часто вижу линуксойдов, которые постоянно (когда хотят обратится к какому-то файлу) переходят в директорию(cd /home), затем смотрят её содержимое (ls), затем переходят дальше (cd /home/aonick), опять (ls) и тд… до достижения файла — для них:


lcd(){
  echo "Директория: $1"
  cd $1 && ls}
После этого переходить в нужную директорию можно так:
lcd /home
это команда и в директорию перейдет и сразу содержимое покажет.

Пример 2
Так как функция выполняется в той же сессии (в отличии от скрипта) — удобно например для команд настраивать автозаполнение по Тab-клавиши, напимер для команды rpm чтобы дописывал из списка установленных пакетов:

_rpm-refresh(){ complete -W "$(rpm -qa) -ivh -ql -qi" rpm; }

После этого — каждый раз когда запускаю функцию:
_rpm-refresh
обновляется список аргументов которые предлагаются по нажатию Tab.
И пользуясь командой rpm уже так, например:

rpm -ql apach<i><Нажимаю  дважды Tab></i>
и вижу список установленных пакетов начинающихся с «apach»

Дополнение:

Функция задается только в текущей сессии и после закрытия терминал про неё система забудет. Чтобы навеки-вечные задать своему пользователю функцию — её прописывают в файл ".bashrc" в домашней директории пользователя.

Язык bash часть 7

Язык командного интерпретатора bash. Part 6. «Условная подстановка параметров»


Продолжаю цикл статей о языке командного интерпретатора bash темой условной подстановки параметров. Благодаря условной подстановке параметров можно проверить, получил ли параметр значение, а также применять вместо его текущего значения другое.
Теперь перейдём к непосредственному разбору различных конструкций подстановок.

${параметр-строка}, ${параметр:-строка}


Логика конструкции: если параметр отсутствует, используется указанная строка, если непустое – значение по умолчанию.

Обе формы записи можно считать равнозначными в большинстве случаев. Символ ":" имеет значение когда параметр инициализирован, но имеет пустое значение. Приведу пару примеров для разъяснения ситуации:

param1=
echo ${param1-"Hello"}
Вывода не будет произведено, так как param1 инициализирован, но имеет пустое значение.

echo ${param2-"Hello"}
Будет выведена указанная строка, так как параметр не был инициализирован.

param2=
echo ${param2:-"Hello"}
Будет выведена указанная строка, так как параметр был инициализирован пустым значением, но использовалась конструкция ":-".

${параметр=строка}, ${параметр:=строка}


Логика конструкции: если параметр имеет пустое значение или не инициализирован, то ему присваивается указанное значение, после чего оно подставляется. Символ ":" имеет значение когда параметр инициализирован. Разберём на примерах:

param3=
echo ${param3="Hello"}
Так как параметр не инициализирован, он не будет выведен.
echo ${param4:="Hello"}
Будет выведена указанная строка, так как param4 не инициализирован.
param5="param"
echo ${param:="Hello"}
Будет выведено первоначальное значение параметра.

${параметр+строка}, ${параметр:+строка }


Логика конструкции: если параметр имеет значение, то используется оно, в противном случае – альтернативная строка. Различия конструкций разберём на примерах:

echo ${param6+"Hello"}
Ничего не выводится.

param7=
echo ${param6+"Hello"}
Будет выведена указанная строка.
param8=123
echo ${param8+"Hello"}
Будет выведена указанная строка.

echo ${param9:+"Hello"}
Ничего не выводится.

param10=
echo ${param10:+"Hello"}
Ничего не выводится.

param11=123
echo ${param11:+"Hello"}
Будет выведена указанная строка.

${параметр? сообщение}, ${параметр:? сообщение}

Логика конструкции: если параметр инициализирован, используется его значение; если параметр не инициализирован – выводится сообщение.

echo ${param12?"hello"}
Выводится сообщение.

echo ${param12:?"hello"}
Выводится сообщение.
param13=
echo ${param13?"hello"}
Не выводится ничего (выводится пустое значение).

param14=123
echo ${param14:?"hello"}
Выводится значение параметра.

${#параметр}

Логика конструкции: возвращается длина значения параметра в байтах. В случае массивов, команда ${#array} возвращает длину первого элемента массива.

Исключения:
1) ${#*} и ${#@} возвращает количество аргументов (позиционных параметров).
2) Для массивов, ${#array[*]} и ${#array[@]} возвращает количество элементов в массиве.

param15=123
echo ${#param15}
Будет выведена длина значения параметра (в данном случае 3).

${параметр#шаблон}, ${параметр##шаблон}


Логика конструкции: удаляет из параметра наименьшую (наибольшую) подстроку, удовлетворяющую указанному шаблону, начиная из головной части значения параметра.

Пример:

param16=12345
echo ${param16#123}
Будет выведено 45.
$ echo $PWD/home/istergul/fold
$ echo ${PWD##*/}
fold


${var%Pattern}, ${var%%Pattern}

Логика конструкции: удаляет из параметра наименьшую (наибольшую) подстроку, удовлетворяющую указанному шаблону, начиная из хвостовой части значения параметра. По сути данная конструкция повторяет предыдущую, только начиная с конца значения параметра. 


=========================Добавление из комментов================
Пример 1
Часто мои скрипты начинаются с такой строчки:


Dir=${1-.}
То есть скрипт запускается и в качестве параметра ему указывается директория, которую надо обработать. Если директория не указана, то обрабатывается текущая директория.

Пример 2
Для начала задам переменную

Pic=/usr/share/wallpapers/Wolf.jpg
Вывод без первых трех символов(любых)
echo ${Pic#???}
r/share/wallpapers/Wolf.jpg


Пример 3
Для той же переменной

Pic=/usr/share/wallpapers/Wolf.jpg
Вывод с пятого по 9ый символы (то есть пропустить от начала 4ре символа и напечатать следующие 5)
echo ${Pic:4:5}
/shar


Пример 4
Переименование всех jpg-файлов в текущей папке под общий шаблон: Image_число.jpg
N=10000; for i in *.jpg;do let N=N+1; mv -i "$i" Image_${N:1}.jpg;done
Работает для не более 9999 файлов в текущей директории

Пример 5
Pic=/usr/share/wallpapers/Wolf.jpg
Перейти в папку содержащую эту картинку
cd ${Pic%/*}
это соответствует
cd /usr/share/wallpapers


Пример 6
Если файл картинка(jpg), то просмотеть ей (например, при помощи програмки eog)

[ "${Pic##*.}" = jpg ] && eog $Pic
 

Язык bash часть 6

Язык командного интерпретатора bash. Part 5. «Операторы цикла»


И вот настал черёд пятого топика цикла. В нём я продолжу рассматривать управляющие структуры командного интерпретатора bash. В предыдущем посте были разобраны условные операторы. Теперь настал черёд таких неотъемлемых языковых структур, как операторы цикла. Циклы, как и условия, являются теми инструментальными средствами, которые обеспечивают управление порядком исполнения команд.
Bash поддерживает циклы типа for, while, until и select.
Теперь перейдём к подробному рассмотрению каждого из них.

Оператор цикла for

Общий синтаксис оператора for:
for переменная [in шаблон]
do
список команд
done

Цикл for в bash значительно отличается от цикла for в таких языках программирования, как C или PHP. Поэтому если вы программируете на C, вам нужно будет привыкнуть к этим отличиям, чтобы не путаться.
В результате подстановки шаблона получается список слов. При каждой итерации переменная принимает каждое последующее значение этого списка, и выполняются команды, стоящие между do и done. Итерации прекращаются по исчерпании слов в списке.

$ for day in Mon Tue Wed Thu Fri
do
echo “Сегодня $day
done

Зарезервированные слова оператора for также можно писать в одну строчку, как это было в предыдущем посте для оператора if. Для этого нужно ставить ";". Перепишем предыдущий пример с учётом данной возможности:
$ for day in Mon Tue Wed Thu Fri; do echo “Сегодня $day”; done

Отсутствие конструкции [in шаблон] эквивалентно записи in $@. О параметре $@ говорилось в моей первой статье.

Оператор цикла while

Общий синтаксис оператора while:


while список1
do
список2
done

Сперва выполняется список1. Если он завершается успешно, т. е. возвращает нулевой код, управление переходит списку2. Итерации продолжаются до тех пор, пока результат выполнения списка1 не станет ненулевым. Например:
i=10
while [ $i gt 0 ]; do
echo $i
i=$(($i-1))
done; echo 'end'


Оператор цикла until

Общий синтаксис оператора until:


until список1
do
список2
done

Сперва выполняется список1. Если он завершается неуспешно, то есть с ненулевым кодом возврата, управление переходит списку2. Итерации продолжаются до тех пор, пока результат выполнения списка1 не станет нулевым. Например:
i=10
until [ $i lt 0 ]; do
echo $i
i=$(($i-1))
done; echo 'end'


Оператор цикла select

Общий синтаксис оператора select:


select переменная [in шаблон]
do
список
done

В результате подстановки шаблона получается список слов. К этим словам оператор добавляет порядковые номера и выводит весь набор в стандартный поток ошибок. Отсутствие конструкции [in шаблон] эквивалентно записи in $@. После этого выводится приглашение и считывается строка из стандартного потока ввода. Если строка содержит номер, соответствующий какому-либо слову из списка, то переменная получает его в качестве значения. Если подходящего слова не было найдено, то значением переменной становится пустая строка. После этого выполняется список команд, и итерации продолжаются до тех пор, пока в строке ввода не попадётся символ конца файла или пока в списке команд не встретится break или return.
Команды break и return служат для управления ходом выполнения цикла. Команда break прерывает исполнение цикла, в то время как return возвращает код результата (нулевой или ненулевой).
Оператор select полезен для создания нумерованных меню. Например, в каталоге ~/temp находится 3 файла: proto.txt, file.txt и readme. Пример фрагмента скрипта, позволяющего быстро просмотреть любой из них.

echo "Выберите файл для просмотра:"
select file in ~/temp/* Quit;
do
if [ -f $file ]; then cat $file;
else break;
fi
done

Запустив данный скрипт, мы увидим на экране:
Выберите файл для просмотра:
1) /home/istergul/temp/file.txt
2) /home/istergul/temp/proto.txt
3) /home/istergul/temp/readme
4) Quit
=================Добавка из комментов===========================
Пример for — 1ый(простой):
#Создает html-галерейку из jpg-картинок в текущей папке


for i in *.jpg; do
        echo "<IMG src=$i><HR>"
done > gallery.html


Пример for — 2ой(тоже простой, но из моего bash_history):
#Выкачевает рейтинг на сегодня с одного сайта

for i in {1..22};do  
        wget -nv http://open-life.org/people/good/page$i -O -|zcat
done > reiting_$(date +%y%m%d).html


Пример while — 1ый(бесконечный цикл):
#Сидюк-хронометр

while : ; do 
        eject; sleep 2; eject -2
done 


Пример while — 2ой(использование в построчной обработке файла)
#Подсчитать сумарный размер jpg-файлов в текущей папке

ls -l *.jpg| (  
        while read Perm nL Uid Gid Size others;do
                let SumSize=SumSize+$Size;
        done;
        echo $SumSize )
 
===============Reply==================
#Подсчитать сумарный размер jpg-файлов в текущей папке

Пример интересный, но всё же лучше для этих целей использовать:

du -bc *.jpg | tail -n1 

Язык bash часть 5

Язык командного интерпретатора bash. Part 4. «Условные операторы»

Данный топик является четвертым топиком цикла «Язык командного интерпретатора bash». Он будет повествовать о таких управляющих структурах языка, как условные операторы. Но перед тем, как перейти к их описанию, необходимо остановиться на некоторых нюансах, которые сделают рассмотрение нижеизложенного материала более понятным.
Во-первых, разберём, что такое список команд. Список команд – это одиночная команда, конвейер или последовательность команд/конвейеров, разделённых одним из следующих операторов: ";", "&&", "||", завершённая точкой с запятой.
; — оператор последовательного выполнения нескольких команд. Каждая последующая команда начинает выполняться только после завершения предыдущей (неважно, успешного или нет);
&& — оператор выполнения команды только после успешного выполнения предыдущей;
|| — оператор выполнения команды только после ошибочного выполнения предыдущей.
Кодом успешного завершения является 0, а ошибочного — не ноль (зависит от типа ошибки). Не нужно путать с обычными языками программирования, когда 1 является аналогом true, а 0 – false.
Теперь можно приступить к непосредственному рассмотрению условных операторов.

Оператор вариантов case


Общий синтаксис оператора case:

case значение in
шаблон1) список1;;
шаблон2 | шаблон3) список2;;
esac

Логическая последовательность выполнения оператора case:
а) ищется первый шаблон, совпадающий со значением;
б) если он найден, выполняется соответствующий ему список команд, завершённый ";;";
в) управление передаётся операторам, следующим за конструкцией case.
Шаблон и список разделяются символом ")". Одному списку команд может соответствовать несколько условий, тогда их нужно разделять символом "|".
В шаблонах можно использовать символы "*", "?", "[ ]", о которых было рассказано во втором топике цикла. С их помощью можно реализовать инструкцию, действующую как default в операторе switch таких языков, как C, PHP.
Приведу пример использования case
:
echo -n "[Универсальный просмоторщик] Укажите имя файла: "; read File
case "$File" in
*.jpg|*.gif|*.png)
eog $File;;
*.pdf)       evince $File   ;;
*.txt)       less $File   ;;
*.html)      firefox $File   ;;
/dev/*)      echo "Ну это страшные файлы."   ;;
*)
echo "Ну ладно, ладно - не такой уж и универсальный."
echo "Этот тип файлов мне не знаком. Не знаю, чем его просмотреть."
;;
esac

Ещё один пример использования конструкции case:
echo "Ошибка. Кому отправить сообщение?"
echo "Начальнику: b"
echo "Коллегам: c"
echo "Никому: any key"
read answercase $answer in
   b|B) mail s "error log" boss < error.log;;
   c|C) mail s "Help! error log" c denis nick < error.log;;
   *) echo "error"; exit;;
esac


Условный оператор if

Общий синтаксис оператора if:

if список1 then
список2
[elif список3 then
список4]
[else
список5]
fi

Квадратные скобки здесь указывают на необязательные конструкции. Логическая последовательность выполнения оператора case:
а) выполняется список1;
б) если он выполнен без ошибок, выполняется список2. В противном случае выполняется список3, и если он завершается без ошибок – список4. Если же и список3 возвращает код ошибки, выполняется список5;
в) управление передаётся операторам, следующим за конструкцией if.
Приведу пример использования if:

if grep -q Bash filethen echo "Файл содержит, как минимум, одно слово Bash."
fi

Когда if и then располагаются в одной строке, то конструкции if и then должны завершаться точкой с запятой. Например:
$ if [ $? ne 0 ]; then echo Error”; fi

Теперь, зная о возможни располагать if и then в одной строке, перепишем вышеуказанный пример:
if grep -q Bash file; then 
echo «Файл содержит слово Bash
fi


Оператор test и условные выражения

В вышеприведённом примере вместо анализа кода завершения использована проверка условия. Две формы такой проверки эквивалентны: встроенная команда test и [условие]. Например, для проверки существования файла нужно написать:

test e <файл>

или

[ -e <файл> ]

Если используются квадратные скобки, они обязательно должны быть отделены друг от друга пробелом, потому что "[" – это название команды, а "]" – это обязательный последний аргумент её завершения.
В случае успешной проверки условия, возвращается 0, а в случае ложности – код ошибки 1.
Команда test может проверять строку на пустоту. Непустая строка приводит к коду завершения 0. Пуста, соответственно – 1. Например:

$ test $USER; echo $?
0

Конструкция "[[ ]]" более универсальна, по сравнению с "[ ]". Этот расширенный вариант команды test. Внутри этой конструкции не производится никакой дополнительной интерпретации имен файлов и не производится разбиение аргументов на отдельные слова, но допускается подстановка параметров и команд. Например:
file=/etc/passwdif [[ -e $file ]]
then
   echo “Файл паролей найден.”
fi

Конструкция "[[ ]]" более предпочтительна, нежели "[ ]", поскольку поможет избежать некоторых логических ошибок. Например, операторы "&&", "||", "<" и ">" внутри "[[ ]]" вполне допустимы, в то время как внутри "[ ]" порождают сообщения об ошибках.
Конструкция "(( ))" позволяет производить вычисление арифметических выражений внутри неё. Если результатом вычислений является ноль, то возвращается код ошибки. Ненулевой результат вычислений даёт код возврата 0. То есть полная противоположность инструкциям test и "[ ]", обсуждавшимся выше.
Оператор if позволяет допускать наличие вложенных проверок:

if echo "Следующий *if* находится внутри первого *if*."
   if [[ $comparison = "integer" ]]
   then (( a < b ))
   else
      [[ $a < $b ]]
   fi
then
   echo '$a меньше $b'
fi


Условные выражения можно комбинировать с помощью обычных логических операций:
! <выражение> – отрицание;
<выражение1> –a <выражение2> – логическое И;
<выражение1> –o <выражение2> – логическое ИЛИ.

Элементарные условные выражения для файлов:

-e — файл существует;
-f — обычный файл (не каталог и не файл устройства);
-s — ненулевой размер файла;
-d — файл является каталогом;
-b — файл является блочным устройством (floppy, cdrom и т.п.);
-c — файл является символьным устройством (клавиатура, модем, звуковая карта и т.п.);
-p — файл является каналом;
-h — файл является символической ссылкой;
-L — файл является символической ссылкой;
-S — файл является сокетом;
-t — файл связан с терминальным устройством;
-r — файл доступен для чтения (пользователю, запустившему сценарий);
-w — файл доступен для записи (пользователю, запустившему сценарий);
-x — файл доступен для исполнения (пользователю, запустившему сценарий);
-g — (sgid) флаг для файла или каталога установлен;
-u — (suid) флаг для файла установлен;
-k — флаг sticky bit установлен;
-O — вы являетесь владельцем файла;
-G — вы принадлежите к той же группе, что и файл;
-N — файл был модифицирован с момента последнего чтения;
файл1 -nt файл2 – файл1 более новый, чем файл2;
файл1 -ot файл2 – файл1 более старый, чем файл2;
файл1 -ef файл2 – файл1 и файл2 являются «жесткими» ссылками на один и тот же файл.

Элементарные условные выражение для сравнения строк:

-z строка – длина строки равна 0;
-n строка – длина строки не равно 0;
строка1 == строка2 – строки совпадают (аналог “=”);
строка1 !== строка2 – строки не совпадают (аналог “!=”);
строка1 < строка2 – строка1 предшествует строке2 в лексикографическом порядке;
строка1 > строка2 – строка1 следует за строкой2 в лексикографическом порядке.
Арифметическое условное выражение имеет формат:
аргумент1 операция аргумент2, где аргументами являются целые числа, и допустимы следующие операции:
-eq – равно;
-ne – не равно;
-lt – меньше;
-le – меньше или равно;
-gt – больше;
-ge – больше или равно;
< — меньше (внутри двойных круглых скобок);
<= — меньше или равно (внутри двойных круглых скобок);
> — больше (внутри двойных круглых скобок);
>= — больше или равно (внутри двойных круглых скобок).

Перепишем предыдущий пример с использованием оператора if:
echo "Ошибка. Кому отправить сообщение?"
echo "Начальнику: b"
echo "Коллегам: c"
echo "Никому: any key"
read answerif [ "$answer" == "b" o "$answer" == "B" ]; then
   mail s "error log" boss < error.log;
elif [ "$answer" == "c" o "$answer" == "C" ]; then
   mail s "Help! error log" c denis nick < error.log;
else
echo "error"; exit;
fi

Язык bash часть 4 (ssmtp)

Резервное копирование домашней папки на getdropbox.com, плюс отсылка логов об этом себе на почту через gmail.com


Цель данной работы — создать архив домашней папки пользователя, положить данный архив в какую-либо локальную папку, скопировать архив в папку dropbox, послать на нужную почту отчет об этом факте, воспользовавшись для этого SMTP-сервером gmail.com.

Я это делаю в ubuntu, но принципиальные отличия для других дистрибутивов будут разве что в установке ssmtp, в остальном отличий быть не должно.


0. Заводим себе аккаунт на getdropbox.com. Кстати — если уж будете регистрироваться, пожалуста, вспользуйтесь моей ссылкой:
getdropbox.com. Вам в этом случае сразу отпилят в виде бонуса +250 Мб (при регистрации «напрямую» этого не будет), и мне собственно — тоже, те же самые 250 Мб. Мелочь, а приятно — мегабайты лишними быть не могут.

1. Ставим ssmtp, при помощи которого будем отсылать почту:


root@sysadm-desktop:~# apt-get install ssmtp -y


2. Идем на gmail.com и заводим там себе аккаунт. У нас будет robot@gmail.com.
3. Идем в свою домашнюю папку, и смотрим, что нам нужно бэкапить, а что нет. В соответствии с этим составляем команду для архиватора. У меня вышло вот что:


tar czvf /tmp/sysadm.tar.gz /home/sysadm/.* /home/sysadm/* --exclude=.gvfs --exclude=В\ плеер --exclude=Видео --exclude=Nexuiz --exclude=VBox --exclude=video --exclude=. --exclude=.. --exclude=/home/sysadm/.thumbnails/

Я наисключал некоторые каталоги, которые слишком объемные, и данные из них в резервном копировании не нуждаются.

Запускаем, смотрим как оно отработало.


4. Настраиваем ssmtp.

root@sysadm-desktop:~# cat /etc/ssmtp/ssmtp.conf 
root=robot@gmail.com
mailhub=smtp.gmail.com:587
hostname=smtp.gmail.com:587
UseSTARTTLS=YESAuthUser=robot@gmail.comAuthPass=yarobotFromLineOverride=YES

root@sysadm-desktop:~# cat /etc/ssmtp/revaliases 
root:robot@gmail.com:smtp.gmail.com:587
sysadm:robot@gmail.com:smtp.gmail.com:587


В файле /etc/ssmtp/revaliases я описал двоих пользователей — от root будем выполнять собственно всю работу через crontab, а для sysadm — для проверки, ну и просто — пусть будет.

5. Проверяем, как все фурычит:


root@sysadm-desktop:~# echo "Test" | ssmtp sysadm@gmail.com


Идем в почтовый ящик sysadm@gmail.com, и в папке «Спам» находим свое письмо. Если находим — то все отлично работает! Что бы такие письма не попадали в спам, нужно создать фильтр, и применять на письма от robot@gmail.com какой-нибудь ярлык.

6. Пишем скрипт для всего того, что мы обозначили в самом начале.


root@sysadm-desktop:~# cat /etc/cron.daily/arc_sysadm 
#!/bin/bash

home_dir=/home/sysadm
tmp_dir=/home/sysadm/files
arc_dir=/home/sysadm/Dropbox/backups
arc_name=sysadm_backup.tar.gz
log=/root/log_arc.log
log_tar=/root/log_tar.log
log_tar_error=/root/log_tar_error.log
log_mail=/root/log_mail.log
# --------------------------------------------------------

echo_log ()
{
echo $(date '+%d-%m-%y %H:%M:%S') $1
echo $(date '+%d-%m-%y %H:%M:%S') $1 >> $log}
# --------------------------------------------------------

echo > $log
echo > $log_tar
echo > $log_mail
echo > $log_tar_error

echo_log "Резервное копирование начинается"


echo_log "home_dir="$home_dir
echo_log "tmp_dir="$tmp_dir
echo_log "arc_dir="$arc_dir
echo_log "arc_name="$arc_name
echo_log "log="$log
echo_log "log_tar="$log_tar
echo_log "log_tar_error="$log_tar_error
echo_log "log_mail="$log_mail

tar czvf $tmp_dir/$arc_name $home_dir/.* $home_dir/* --exclude=.gvfs --exclude=В\ плеер --exclude=Видео --exclude=Nexuiz --exclude=VBox --exclude=video --exclude=. --exclude=.. --exclude=/home/sysadm/.thumbnails/ 1>> $log_tar 2>> $log_tar_error

echo_log "Резервное копирование закончено"

echo "Subject: Резервное копирование домашней папки sysadm" >> $log_mail
echo >> $log_mail
cat $log >> $log_mail
echo >> $log_mail

echo === Error-лог tar-а: ================================ >> $log_mail
echo >> $log_mail
cat $log_tar_error >> $log_mail
echo >> $log_mail

echo === Лог tar-а: ===================================== >> $log_mail
cat $log_tar >> $log_mail

cat $log_mail | ssmtp sysadm@gmail.com

rm -f $arc_dir/$arc_name
cp $tmp_dir/$arc_name $arc_dir/$arc_name


Поправить здесь нужно все переменные из самого начала под свою файловую структуру, и — вписать свою строку для архиватора, которую мы составили в п.3. Вроде больше ничего трогать не надо.

Не забываем сделать:


root@sysadm-desktop:~# chmod +x /etc/cron.daily/arc_sysadm 


Наш скрипт будет выполняться раз в сутки.

Имеем: раз в сутки производится выборочное архивирование домашней папки в два места: в локальный каталог и на сетевой ресурс dropbox, а отчет об этом факте падает на нужную почту. 


Язык bash часть 3

Язык командного интерпретатора bash. Part 3. «Массивы».


И вот настал черёд третьего поста из цикла «Язык командного интерпретатора bash». В первых двух топиках мы в общих чертах рассмотрели понятие параметров оболочки и механизмы подстановок. В текущем топике речь пойдёт о массивах интерпретатора bash. Топик будет совсем небольшим, так как объём охватываемой им информации также невелик и легко усваивается.
Командный интерпретатор bash поддерживает одномерные массивы с неограниченным числом элементов. Да, лимит на количество элементов отсутствует, в то время, как в других оболочках существуют эти ограничения. Например, в оболочке ksh максимальным числом элементов является 1024 элемента.
Как я говорил в своём первом посте, в bash есть только один тип – строковый, а значит, все элементы массива также являются строковыми. Определяющим фактором здесь служит содержимое параметров. Нумерация элементов начинается с нуля.
Приведу пример присвоения значений элементам массива:

$ arr[0]=element1
$ arr[5]=element
$ arr[9]=elementN

Чтобы обратиться к значению элемента массива, следует также указать имя массива и в квадратных скобках порядковый номер элемента.
Например, выведем первый элемент массива, инициализированный в первом примере:

$ echo ${arr[0]}

Чтобы обратиться ко всем элементам массива сразу, нужно в качестве порядкового номера элемента массива указать символ * или символ @. Например:
$ echo ${arr[*]}
element1 element elementN

Символ @ нужно использовать, если значение хотя бы одного элемента массива может содержать пробелы.
Оболочка позволяет инициализировать массив не только последовательно указывая новый элемент в каждой строчке, но и целиком. Например:

$ arr=(1 2 3 4 5 6 7 8 9)

Данный пример будет эквивалентен списку:
$ arr[0]=1; arr[1]=2; arr[2]=3; arr[3]=4; arr[4]=5; arr[5]=6; arr[6]=7; arr[7]=8; arr[8]=9

Данные способы инициализации можно применять не только в bash, но и в других командных оболочках, таких как ksh.
А этот способ работает только в bash:

$ mass=([0]=element0 [5]=element5)

Для того, чтобы посмотреть количество элементов в массиве, необходимо выполнить команду:
$ echo ${#arr[@]}

Вывести содержимое всего массива:
$ echo ${arr[@]}
 
===========================Добавка из комментов=================================
Добавки:
1) Посмотреть количество элементов массива: echo ${#arr[@]}
2) Обработать массив(в данном случае показать каждый элемент):
for ((i=0;i<${#arr[@]};i++));do echo ${arr[$i]};done
+

Язык bash часть 2

Язык командного интерпретатора bash. Part 2. "Подстановки"

Данный топик является логическим продолжением моего предыдущего поста, в котором я рассказал о параметрах языка командного интерпретатора bash. Интерес, возникший у пользователей к моему первому посту подтолкнул меня на написание продолжения. В текущем топике я расскажу об использовании различных механизмов подстановок в оболочке bash.

Подстановка параметров

Параметрам можно найти различное применение. Их можно использовать как имена, части имён или аргументы команд. Перед тем, как выполнить команду, bash заменит имя параметра его значением.

$ cwd=/home/istergul # присваиваем параметру cwd путь к домашнему каталогу
$ cd $cwd # переходим в домашний каталог, подставляя в команду cd параметр cwd

Вывести на экран файл readme из домашнего каталога теперь можно, введя команду (если конечно, данный файл существует):
$ more ${cwd}/readme

Здесь имя параметра взято в скобки. Это делать не обязательно, но это позволит отделить имя параметра от окружающих символов с целью его выделения.
Возможности bash позволяют производить подстановку команд, то есть заменять имя команды на результат её выполнения. Например:

$ cd ~
$ cwd=`pwd`

Или же так:
$ cwd=$(pwd)

Теперь переменная cwd будет содержать путь к вашему домашнему каталогу.
Вот ещё пример командной подстановки:

$ tar -czf /backup/$(date +%A).tgz /etc

Команда создаёт архив в директории /etc с названием /backup/<текущий день недели>.tgz.
В следующем примере команда добавляет в приглашение командной строки вывод последней строки из системного log-файла.

$ PS1="\$(tail -1 /var/log/messages)\n$PS1"

Производить подстановки можно не только с определёнными вами параметрами, но и с переменными окружения. Например, выведем поэкранно список всех процессов, запущенных от вашего имени:
$ ps ef | grep $USER | less

Останавливаться на командах ps, grep и less не буду. Вы можете узнать о них, используя команду man.

Подстановка символов шаблонов


Механизм шаблонов имён файлов позволяет не перечислять похожие имена файлов и каталогов, а указать на группу имён, задав краткий образец (шаблон). Шаблоны указываются с помощью специальных символов, которые можно комбинировать в одной команде. Перечислим символы шаблонов:

* — произвольная строка символов, в том числе пустая. Следует заметить, что сюда не входят имена файлов, начинающиеся с ".", то есть скрытые файлы.
$ ls ./*.txt # все файлы в текущем каталоге с расширением txt

? – одиночный символ;
$ ls ./file?.txt # файлы в текущем каталоге с расширением txt, начинающиеся с file (такие как file1.txt, filex.txt и др.)

[mMx] – любой символ из перечисленных;
$ ls ./file[2N].txt # файлы в текущем каталоге, такие как file2.txt, fileN.txt

[a-zA-F] – любой символ из указанных интервалов;

$ ls ./file[3-49] # файлы в текущем каталоге, такие как file3, file4, file9

[^a-zxy] – любой символ, не указанный в скобках;
$ ls ./file[^0].txt # все файлы в текущем каталоге, кроме file0.txt

Для того чтобы символы шаблонов использовать как обычные символы, их нужно экранировать:
$ touch file\* # создать файл с именем file*


Другие подстановки

Подстановка тильды:

~ — заменяется на имя вашего домашнего каталога;
~+ — заменяется на путь к текущему каталогу;
~- — заменяется на путь к предыдущему каталогу;
~istergul/Desktop — заменяется на путь к папке Desktop в домашней папке istergul.


Раскрытие скобок:
name1{name2,name3}name4 – заменяется на name1name2name4 name1name3name4. Пробелы ставить внутри скобок не нужно! Данную функцию можно применять, когда нельзя составить общего шаблона. Например:

$ cat /home/istergul/{file1,name1,readme} > file


Подстановка арифметических выражений
$((выражение)) или $[выражение] – эквивалентные формы записи. Внутри выражения выполняются установки параметров. Приоритет арифметических операций можно посмотреть man bash в секции ARIFMETIC EVALUATION. Например, количество часов прошедшее с момента запуска оболочки, можно подсчитать следующим образом:

$ echo $(( $SECONDS/3600 ))
 
=======================Добавки из комментов========================
Простой пример командной постановки:

1)

tar -czf /backup/$(date +%A).tgz /etc

Создает архив директории /etc с названием(сегодня) /backup/Четверг.tgz, 
а если выполню завтра то будет /backup/Пятница.tgz



2)

PS1="\$(tail -1 /var/log/messages)\n$PS1"

В приглашении командной строки добавился вывод последней строки из
 системного log-файла

 

Язык bash часть 1

Язык командного интерпретатора bash. Part 1. "Параметры"


Решил написать небольшой цикл постов о языке командного интерпретатора bash. Первый пост описывает параметры, используемые в командной оболочке bash.

Вместо переменных, которые используются в привычных нам языках программирования, в bash используется концепция параметров. Одним из главных критериев, описывающих параметры, являются имена параметров. Именем параметра может быть: слово, состоящее из латинских букв, цифр и знаков подчёркивания (в этом случае первым символом должна быть буква); число или один из следующих символов: *, @, #, ?, $, !, 0, _. Все параметры имеют строковый тип. Перед именем параметра следует ставить знак $, чтобы сослаться на его значение.

Параметры делятся на 3 группы:
— переменные оболочки;
— позиционные параметры;
— специальные параметры.
Теперь поговорим о каждой группе более подробно.

Переменные оболочки


С переменными оболочки можно проводить операции присваивания. Если значение переменной содержит специальные символы, их следует экранировать обратным слешем или кавычками:


$ param=”Hello, world!”
$ echo param #вывод имени параметра
param
$ echo $param #вывод значения параметра 
Hello, world!

Установленные таким образом переменные доступны только внутренним командам оболочки. А как же поступить, чтобы они были доступны и дочерним процессам? Их всего лишь нужно поместить в окружение bash с помощью команды export:

$ export PARAM=”Hello, world!” 

Теперь этот параметр будет доступен программам, запущенным из-под bash. Также упомяну, что param и PARAM не одна и та же переменная, а разные, так как регистр имеет значение. Так как переменная PARAM будет доступна дочерним процессам оболочки, то её можно назвать глобальной.
Можно выполнить следующие действия, чтобы почувствовать вышеописанную разницу:
1. Создайте пустой файл и сделайте вывод двух переменных param и PARAM. Например:

$ cat > script
echo Env variable: $PARAM
echo Local variable: $param
^D
$

Ctrl+D заканчивает ввод и закрывает файл.
2. Теперь сделайте наш скрипт исполняемым:

$ chmod a+x script

3. Определите переменную param и выполните скрипт:

$ param=”Hello, world (from local)”
$ echo $paramHello, world (from local)
$ ./script
Env variable: Hello, world!
Local variable:
$

Когда оболочка bash начинает работу, она устанавливает для себя некоторые переменные окружения. Они используются дочерними процессами для установки какой-либо конкретной информации.
Приведу некоторые переменные окружения:
BASH_VERSION – версия командной оболочки;
USER – имя пользователя;
UID, EUID – реальные и эффективный userID
HOME – путь к домашнему каталогу пользователя;
HOSTNAME – имя компьютера;
HOSTTYPE – тип процессора компьютера;
OSTYPE – ОС;
HISTFILE – расположение истории команд;
HISTSIZE – размер истории команд;
LANG – язык текущего сеанса;
LINES – число строк на экране;
COLUMNS – число столбцов на экране;
PS1, PS2, PS3, PS4 – переменные, определяющие вид приглашения bash;
Для того, чтобы просмотреть значения всех текущих переменных текущего сеанса, необходимо выполнить команду set.
Если переменная больше не нужна, её можно разрегистрировать командой unset.

$ unset param

Позиционные параметры


Здесь я буду краток. Имя позиционного параметра представляет собой натуральное число, а значение – аргументы с соответствующими номерами, переданные сценарию или оболочке при их запуске (точкой отсчёта является 1, так как 0 используется одним из специальных параметров).


Специальные параметры


Имена специальных параметров представляет собой специальные символы, перечисленные ниже. Эти параметры исполняют роль шаблонных переменных, подстановку которых производит bash.

$0 – имя выполняемого сценария;
$# — количество позиционных параметров, переданных сценарию;
$_ — последний аргумент предыдущей из выполнявшихся команд;
$? – код завершения последней команды (0 – успешно, другое – ошибка);
$$ — PID текущего процесса;
$! – PID последнего асинхронного процесса;
$* — все позиционные параметры, собранные в одну строку («$1x$2x…$n»);
$@ — все позиционные параметры, подлежащие дальнейшему разбору («$1» «$2» …«$n»).

Оболочка bash позволяет организовать диалоговый ввод значения параметра с помощью команды read:


echo n “Продолжить? (y/n): 
read yesno
echo $yesno

Здесь команда read считывает значение, введённое пользователем в параметр yesno.
А что, если требуется ввести значение нескольких параметров в одну строку? Тогда необходимо после команды read вписать несколько имён параметров:

read name lastname

Если пользователь ввёл меньше значений, чем требовалось, тогда оставшимся параметрам будет присвоено пустое значение, а если больше – весь остаток строки будет присвоен последнему из перечисленных параметров.



=====================Добавление из комментариев======================
 http://open-life.org/blog/bash/270.html#comment2071

Как вариант, использовать if

read nameif [ "$name" ];
then echo $name;
else echo "anonymous";
fi

Еще довольно интересным может оказаться Advanced Bash-Scripting Guide, но не каждый его осилит :) 
 ":" добавь
# echo $name
# echo ${name:=anonymous}
anonymous# echo $name
anonymous
 
Всем очень рекомендую почитать Bash Pitfalls (на английском, на русском).

А вот сборник довольно редких, но полезных советов.