Специальные и внутренние переменные:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
$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 последнего асинхронного процесса |
Переменные интерпретатора команд:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
~ - домашний каталог ~- - ссылка на предыдущую рабочую папку . - ссылка на текущую папку .. - ссылка на папку, расположенную над текущей Механизмы подстановки ? - любой символ * - любое кол-во любых символов (в том числе ни одного), но не*-файлы! ** - любые файлы и каталоги, в том числе из всех подкаталогов [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 |
Пример как присваивается переменная:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
a=HEllo set | grep '^a' export a env | grep '^a' dir=/bin ls -l $dir echo $a a=pwd $a |
Примеры с кавычками:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
Различие между кавычками В одинарных кавычках содержимое выводится как есть. В двойных кавычках переменные исполняются. 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 |
Применение переменных с программами:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
` - обратный апостроф ( не путать с одинарной кавычкой) ` - служит для выполнения команды `команда` - выполнится команда внутри апострофов $(команда) - ведет себя аналогично при использовании обратного апострофа (`) 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 |
Ввод пользователя:
1 2 3 4 5 6 |
Программа read, ожидает ввода пользователя и сохраняет в переменную read a echo $a Пример использования: echo -n "Enter Name: "; read a; echo Hello "$a" |
Арифметика:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
!!! шелл оперирует переменными окружениями !!! Арифметики не будет при таких записях: 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 |
Перенаправления вывода:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
$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 |
Операторы и сравнение:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
# - комментарий $? - коды возврата [ - это программа сравнения, и если выполнить (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=: |
Полезные параметры из файлов:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
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 - проверка поддержки виртуализации процессором |