Рубрики
bash

bash \ специальные символы \ переменные интерпретатора команд \ ввод \ вывод

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

$0     - имя выполняемого скрипта
$0 $1 ... $9 - позиционные переменные
$1 $2 ... - первый, второй и так далее позиционный параметр


$#     - количество позиционных параметров, переданных сценарию
$#     - количество параметров командной строки

$* и $@ - все параметры командной строки
$*     - все позиционные параметры, собранные в одну строку («$1x$2x…$n»)
$@     - все позиционные параметры, подлежащие дальнейшему разбору («$1» «$2» …«$n»)
         здесь позиционным параметром называется строка(и) переданная скрипту в качестве параметра при запуске
         Имя позиционного параметра в скрипте представляет собой натуральное число начиная с 1, например

$_     - последний аргумент предыдущей из выполнявшихся команд

$?     - код завершения последней команды (0 – успешно, другое – ошибка)
$?     - код возврата программы
$?     - код возврата последней выполненной программы.

$$     - PID процесса shell
$$     - PID текущего процесса (? следующий свободный PID)
$$     - PID процесса shell, исполняющего данный shell script.

$!     - PID последней программы, запущенной в background режиме
$!     - PID последнего асинхронного процесса

Переменные интерпретатора команд:

~ - домашний каталог
~- - ссылка на предыдущую рабочую папку
. - ссылка  на текущую папку
.. - ссылка на папку, расположенную над текущей
Механизмы подстановки
? - любой символ
* - любое кол-во любых символов (в том числе ни одного), но не*-файлы!
** - любые файлы и каталоги, в том числе из всех подкаталогов
[abc] - один из символов указанный в скобках
[a-f] - символ из указного диапазона
[!abc] - любые символы, кроме тех, что указаны в скобках
function () - Функции



EDITOR=nano crontab -e
 
export http_proxy=http://ya.ru:3128 - объявляем глобальную переменную
wget http://что_то_скачать - пытаемся воспользоваться wget
 
 

Показать переменные:
set - показывает все переменные окружения
env - показывает переменные помеченные как экспортируемые
 
Можно увидеть в настройках:
login, sshd, telnetd,  ~/.profile,  ~/.cshrc и в других файлах.
Переменные: HOME, SHELL, PATH, TERM. LOGNAME, USER, EDITOR, ENV и т.д.


BASH - показывает путь к команде (/bin/bash)
BASH_COMMAND - команда выполняемая в текущий момент
BASH_VERSION - версия bash
COLORS - ширина строки терминала (в символах)
DYSPLAY - обозначает Х-экран, в котором будут отображаться команды, запущенные из
          текущего интерпретатора команд (например, :0.0)
EUID - ид номер текущего пользователя (основан на записи /etc/passwd)
FCEDIT - определяет текстовый редактор (для fc)
GROUPS - выводит список группа, в которые входит текущий пользователь
PROMT_COMMAND - устанавливает команду для запуска перед появлением командной строки (по умолчанию это ls)
PS1 - устанавливает приглашение для командного процессора (дата, время, имена пользователей и т.д)
PWD - эта папка является текущей
RANDOM - данная переменная генерирует случайное число от 0 до 32767
SECONDS - количество секунд с начало работы интерпретатора
SHELL - содержит полный путь текущего интерпретатора команд
SHELLOPTS - вывести список включенных параметров интерпретатора команд
EDITOR - редактор по умолчанию


Удаление переменной:
unset CLICOLOR
unset EDITOR
unset http_proxy

Пример как присваивается переменная:

a=HEllo
set | grep '^a'
 
export a
env | grep '^a'
 
dir=/bin
ls -l $dir
 
echo $a
 
a=pwd
$a

Примеры с кавычками:

Различие между кавычками
В одинарных кавычках содержимое выводится как есть.
В двойных кавычках переменные исполняются.
 
a='Hello World'
echo $a
 
a="Hello World"
echo $a
 
Обходимся без кавычек, экранирование пробела с помощь слеша:
a=Hello\ World
echo $a
 
Примеры подстановки переменной:
a="Hello"
b=$a
echo $b
 
Пример с подстановкой переменно и работы одинарной кавычки
Одинарные кавычки всегда передают значение как есть, то есть шелл проигнорирует переменную.
b='$a World'
echo $b

Пример а если мы всё-таки хотим передать переменную:
На помощь приходят двойные кавычки:
b="$a World"
echo $b

Экранирование(слеш):
Слеш отменяет действие многих спец символов.
b=$a\ world
echo $b
 
b=\$a\ World
echo $b
 
b=$aWorld
echo $b
 
b=${a}World
echo $a
echo $b
 
Значения переменных рекомендуется брать в фигурные скобки.
b=${a}World
echo $a
echo $b

Применение переменных с программами:

` - обратный апостроф ( не путать с одинарной кавычкой)
` - служит для выполнения команды
 
`команда` - выполнится команда внутри апострофов
$(команда) - ведет себя аналогично при использовании обратного апострофа (`)
 
dir='pwd'
echo $dir
 
d=$(date)
echo $d
 
x=`date '+%Y.%m.%d'`
echo $x
 
z=$(date '+%Y.%m.%d')
echo $z
 
c=`ps -uaxf | grep sshd |grep -v grep`
echo $c
 
 
сгенерировать случайное число
rnd=`jot -r 1 1 10`
 
Сгенерировать число от 1 до 10 
gen10=`seq 10`
echo $gen10
 
filecount=`ls/bin | wc -l`
echo $filecount

Ввод пользователя:

Программа read, ожидает ввода пользователя и сохраняет в переменную
read a
echo $a
 
Пример использования:
echo -n "Enter Name: "; read a; echo Hello "$a"

Арифметика:

!!! шелл оперирует переменными окружениями
!!! Арифметики не будет при таких записях:
a=3+6
echo $a
 
a=222
b=333
 
c=${a}${b}
echo $c
 
c=${a}+${b}
echo $c
 
!!! Арифметике быть!
Для арифметических действий используется конструкция из скобок $(( выражение ))
a=$((3+6))
a=$(($a*6))
 
А если сделать вот так:
c=((${a}+${b}))
c=$((${a}+${b}))
echo $c
 
Программа для арифметики expr:
a=1
a=$(expr $a + 1)
echo $a

Перенаправления вывода:

$param - используется для расширения параметра переменной
cmd - любая программа linux


cmd1 'cmd2' - выполнится первым cmd2. cmd1 выполниться с результатом cmd2
cmd1 $(cmd2) - выполнится первым cmd2. cmd1 выполниться с результатом cmd2
cmd1 > - перенаправление стандартного вывод команды
cmd1 < - перенаправление стандартного ввода команды 
cmd1 >> - добавляет стандартный вывод команды в файл, не удаляя его текущего содержимого
cmd1 &>> file - дописывает в конец файла стандартный вывод и ошибки
cmd1 | cmd2 - связывает вывод одной команды и ввод другой
cmd1 & - запускает команд в фоновом режиме
cmd1 & cmd2  - запускает cmd1 в фоне, cmd2 на виду
(cmd1;cmd2) - выполняет обе команды и той же оболочке
cmd1 && cmd2 - запускает cmd1, если получено нулевое значение, запускает cmd2 
               (выполняет cmd2, если cmd1 выполнена успешно )
cmd1 || cmd2 -  запускает cmd1, если не получено нулевое значение, запускает cmd2
                (выполняет cmd2, если cmd1 вернула ошибку)
cmd1 ; cmd2 -  запускает cmd1 и, когда ее выполнение завершается , запускает cmd2

Стандартные потоки (файлы):
0 – Стандартный ввод (stdin) (клавиатура)  /dev/stdin 
1 – Стандартный вывод (stdout) (экран) /dev/stdout
2 – Стандартный вывод ошибок (stderr) (экран) /dev/stderr
!!! Каждая программа в unix всегда использует stdin,stdout,stderr (демоны не используют)

cmd1 2> file - переводит сообщение об ошибках в указанный файл
cmd1 &> file - переадресовывает вывод и ошибки в файл
cmd1 >& file - переадресовывает вывод и ошибки в файл

cat -  Нажмите Ctrl+D – (EOF) для завершения работы
cat > testfile
Введите строку и нажмите Enter
Нажмите Ctrl+D – (EOF) для завершения работы
 
 
cat testfile > testfile 2> errfile
cat errfile
cat /etc/passwd > testfile2
cat < /etc/group > testfile
 
ls -l /etc > mylist
 
touch /bin/mycustomfile 2>errfile
 
2>errfile ls -l -R  /etc 1>poleznoe
cat errfile
cat poleznoe 


Операторы и сравнение:

#  - комментарий
$? - коды возврата
 
[ - это программа сравнения, и если выполнить (which [) мы увидим что программа называется test и она возвращает 1 или 0, код возврата можно увидеть по echo $?
man [
test 6 -lt 3
echo $?
 
 
$1 - аргумент запуска программы 
$2 - аргумент запуска программы
$3  - аргумент запуска программы
 
Пример работы:
agr.sh - создаем скрипт
--------------
echo $2 $3 $1
--------------
 
Ну и проверяем: 
./agr.sh aaa bbb ccc
 
Операторы равенства:
eq  равно (=) (Equals)
ne  не равно (!=) (Not equal)
 
Операторы диапазона:
gt больше (>) (Greater than)
lt меньше (<) (Less than)
ge больше или равно (=>) (Equal or greater than)
le меньше или равно (=<) (Equal or less than)
 
 
Во многих языках программирования двоеточие (:) означает истина (True) и возвращает 0
 
Задать символ разделитель с помощью IFS
IFS=:

Полезные параметры из файлов:

cat /etc/proc/cmdline - показывает параметры переданные ядру при загрузке
cat /proc/cpuinfo - показывает информацию о процессоре
cat /proc/devices - отображает существующие устройства посимвольного ввода-вывода и блочные устройства
cat /proc/diskstats - отображает диски, разделы и статистику по ним
cat /proc/filesystems - вывести список поддерживаемых ядром файловых систем 
                        (nodev - означает что данный тип не используется ни одним устройством)
cat /proc/interrupts - просмотр присвоенных IRQ каналов
cat /proc/iomem - показать адреса физической памяти
cat /proc/loadavg - показать средние загрузки за  1мин,5мин,15мин
cat /proc/meninfo - показать доступную оперативную память и память подкачки
cat /proc/modules - показать загруженные модули, размер памяти, загруженные копии программ и память ядра
cat /proc/mounts - показать информацию о смонтированных локальных/удаленных файловых систем
cat /proc/partitions - показать смонтированные локальные разделы
cat /proc/mdstat - если есть RAID ( программный mdm) покажет статус RAID
cat /proc/stat - отобразит статистику ядра с момента запуска системы
cat /proc/swaps - отобразить информацию о размере файла подкачки
cat /proc/uptime - секунды с момента загрузки системы
cat /proc/version - вывести версию ядра и соответствующего компилятора

egrep '^flags.*(vmx|svm)' /proc/cpuinfo - проверка поддержки виртуализации процессором