Специальные и внутренние переменные:
$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 - проверка поддержки виртуализации процессором