Условные операторы if..else командной оболочки bash

Типы командных оболочек

В *nix-системах существует два основных типа оболочек: оболочки на основе Bourne shell и оболочки на основе C shell.

Типичными представителями оболочек типа Bourne shell являются:

   sh (Bourne shell)

   bash (Bourne Again shell)

   ksh (Korn shell)

   zsh (Z Shell)

К оболочкам типа C Shell относятся:

   csh (C shell)

   tcsh (TENEX/TOPS C shell)

Ниже представлены некоторые из самых распространенных шеллов, используемых в *nix-системах:

Примечание: Термин «*nix-системы» обозначает -подобные операционные системы.

sh (Bourne shell)

sh (сокр. от Bourne shell») — это самая старая (среди рассматриваемых) оболочка, написанная Стивеном Борном из AT&T Bell Labs для ОС UNIX v7. Оболочка доступна практически в любом *nix-дистрибутиве. Многие другие шеллы уходят своими корнями именно к sh. Благодаря своей скорости работы и компактности, данная оболочка является предпочтительным средством для написания shell-скриптов. К её недостаткам можно отнести отсутствие функций для использования оболочки в интерактивном режиме, а также отсутствие встроенной обработки арифметических и логических выражений.

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

Характерные черты sh:

   Полные пути к интерпретатору: /bin/sh и /sbin/sh.

   Приглашение для обычного пользователя: .

   Приглашение для суперпользователя (root): .

bash (Bourne-Again shell)

bash (сокр. от Bourne–Again shell») — это усовершенствованный и дополненный вариант шелла sh, является одной из самых популярных современных командных оболочек *nix-систем.

   Совместим с sh.

   Объединяет в себе полезные фишки оболочек ksh и csh.

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

Характерные черты bash:

   Полный путь к интерпретатору: /bin/bash.

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

   Приглашение для суперпользователя (root): .

ksh (Korn shell)

ksh (сокр. от Korn shell) — это командная оболочка, разработанная Дэвидом Корном из AT&T Bell Labs в 1980-x годах.

   Является расширением sh.

   Имеет обратную совместимость с sh.

   Имеет интерактивный функционал, сравнимый с csh.

   Включает в себя удобные для программирования функции, такие как: встроенную поддержку арифметических выражений/функций, Си-подобный синтаксис скриптов и средства для работы со строками.

   Работает быстрее, чем csh.

   Может запускать скрипты, написанные для sh.

Характерные черты ksh:

   Полный путь к интерпретатору: /bin/ksh.

   Приглашение для обычного пользователя: .

   Приглашение для суперпользователя (root): .

csh (C shell)

csh (сокр. от C shell) — это командная оболочка, созданная Биллом Джоем (автором редактора vi) с целью усовершенствования стандартного шелла Unix (sh).

   Имеет встроенные функции для интерактивного использования, например, псевдонимы (aliases) и историю команд.

   Включает в себя удобные для программирования функции, такие как: встроенную поддержку арифметических выражений и Cи-подобный синтаксис скриптов.

Характерные черты csh:

   Полный путь к интерпретатору: /bin/csh.

   Приглашение для обычного пользователя: .

   Приглашение для суперпользователя (root): .

tcsh (TENEX C Shell)

tcsh (сокр. от TENEX C shell) — это командная оболочка, созданная Кэном Гриром, которая позиционируется как улучшенная версия шелла csh.

   Имеет полную совместимость csh.

   Именно в данном шелле впервые появилась функция автодополнения команд и путей.

   Удобна для интерактивной работы.

   Поддерживает редактор командной строки в стиле vi или emacs.

   Является стандартным шеллом во FreeBSD.

Характерные черты tcsh:

   Полный путь к интерпретатору: /bin/tcsh.

   Приглашение для обычного пользователя: .

   Приглашение для суперпользователя (root): .

zsh (Z Shell)

zsh (сокр. от Z shell) — это командная оболочка, созданная Паулем Фалстадом во время его учебы в Принстонском университете, позиционируется как свободная современная sh-совместимая командная оболочка.

   Среди стандартных шеллов больше всего похожа на ksh, но включает в себя множество улучшений.

   Встроенная поддержка программируемого автодополнения команд, имен файлов и пр.

   Поддержка проверки орфографии и опечаток.

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

Характерные черты zsh:

   Полный путь к интерпретатору: /bin/zsh.

   Приглашение для обычного пользователя: .

   Приглашение для суперпользователя (root): .

Переменные (ключевые слова var, let и const)

Переменная – это именованный участок памяти для хранения данных.

Представить себе переменную можно как некоторую область памяти, в которую вы можете как записать некоторую информацию, так и прочитать её из неё. Доступ к этому месту в памяти выполняется по имени, которое вы установили переменной при её создании.

Данные, хранящиеся в переменной, называются её значением.

В процессе выполнения программы значения переменной могут меняться. Но в определённый момент времени переменная всегда имеет какое-то одно значение.

В JavaScript до ES6 (ECMAScript 2015) объявление (создание) переменных осуществлялось с использованием только ключевого слова .

// объеявление переменной message (message - это имя переменной)
var message;

При создании переменной ей сразу же можно присвоить некоторое значение. Эту операцию называют инициализацией переменной.

Присвоение переменной значения выполняется через оператор .

// например, создадим переменную email и присвоим ей в качестве значения строку "[email protected]"
var email = '[email protected]';
// установим переменной email новое значение
email = '[email protected]';

Для того чтобы получить значение переменной к ней нужно просто обратиться по имени.

// например, выведем в консоль браузера значение переменной email
console.log(email);

Переменная, которая объявлена без инициализации имеет по умолчанию значение .

var phone;
// например, выведем в консоль браузера значение переменной phone
console.log(phone); // undefined  

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

// например, объявим с помощью одного ключевого слова var сразу три переменные, и двум из них сразу присвоим значения
var
  price = 78.55,
  quantity = 10,
  message;

Объявление переменных с помощью let и const

Сейчас ключевое слово практически не используется, вместо него новый стандарт (ES6) рекомендует использовать и .

В чем отличия от ?

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

{
  let name = 'John';
  console.log(name); // "John"
  {
    console.log(name); // "John"
  }
}
console.log(name); // Uncaught ReferenceError: name is not defined

Переменная, объявленная через ключевое слово имеет функциональную область видимости. Т.е. она ограничена только пределами функции.

Такая переменная будет видна за пределами блока, в котором она создана.

{
  var name = 'John';
  console.log(name); // "John"
  {
    console.log(name); // "John"
  }
}
console.log(name); // "John"

2. Переменные, созданные с помощью не поднимаются к началу текущего контекста, т.е. hoisting для них не выполняется. Другими словами, к такой переменной нельзя обратиться до её объявления.

age = 10; // ReferenceError: Cannot access 'age' before initialization
let age = 28;

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

age = 10;
var age = 28;

Константы (const)

Мы разобрали отличия от . А что же насчёт ? Переменные, созданные с помощью ведут себя также как с . Единственное отличие между ними заключается в том, что непосредственное значение переменной созданной через вы не можете изменить. Таким образом, – это ключевое слово, предназначенное для создания своего рода констант.

const COLOR_RED = '#ff0000';

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

При попытке изменить значение константы вам будет брошена ошибка.

const COLOR_RED = '#ff0000';
COLOR_RED = '#f44336'; // Uncaught TypeError: Assignment to constant variable.

Когда переменной вы присваиваете значение, имеющее объектный тип данных, в ней уже будет храниться не сам этот объект, а ссылка на него. Это необходимо учитвать при работе с переменными в JavaScipt.

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

const COLORS = ;
// присвоить другой объект или значение константе нельзя
COLORS = []; // Uncaught TypeError: Assignment to constant variable.
COLORS = { red: '#ff0000', green: '#00ff00', blue: '#00ff00' }; // Uncaught TypeError: Assignment to constant variable.
COLORS = '#00ff00'; // Uncaught TypeError: Assignment to constant variable
// но имзменить сам объект можно
COLORS.push('#4caf50');
console.log(COLORS); // 

Операторы

Пайпы | — передает результат выполненной инструкции следующему пайпу

# command1 | command2 | command3  
ls -l | grep .md$ | less

Точка с запятой ; — выполняет команды последовательно

# command2 will be executed after command1
command1 ; command2

Амперсанд & — оболочка выполняет команду асинхронно в подоболочке. Другими словами, эта команда будет выполняться в фоновом режиме

Двойной амперсанд (И) && — вторая команды будет выполнена только в случае УСПЕШНОГО заверения первой команды

# command2 will be executed if, and only if, command1 finishes successfully (returns 0 exit status)
command1 && command2

Двойной пайп (ИЛИ) — вторая команды будет выполнена только в случае НЕУДАЧНОГО заверения первой команды

# command2 will be executed if, and only if, command1 finishes unsuccessfully (returns code of error)
command1 || command2

Тестовые — Эти выражения помогают нам указать результаты условного выражения. Используются обычно в блоках if

# Single-line
if ]; then echo "true"; fi

# Multi-line
if ]; then
  echo "true"
fi

# Single-line
if ]; then echo "true"; else echo "false"; fi

# Multi-line
if ]; then
  echo "true"
else
  echo "false"
fi

2>&1

Конструкция 2>&1 предназначена для перенаправления стандартного вывода и стандартного вывода ошибок в один файл.

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

ls -l /bin/usr > ls-output.txt 2>&1

Используя этот метод, мы выполняем два перенаправления. Сначала мы перенаправляем стандартный вывод в файл ls-output.txt, а затем перенаправляем дескриптор файла 2 (стандартная вывод ошибок) на дескриптор файла один (стандартный вывод), используя обозначения 2>&1.

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

В приведённом выше примере

>ls-output.txt 2>&1

перенаправляет стандартную ошибку в файл ls-output.txt, но при изменении порядка на

2>&1 >ls-output.txt

стандартная ошибка направлена на экран.

Разное

Подборка команд, показывающих бОльшую скорость работы с консолью, чем с GUI или просто удобных команд. Многие из них могут быть реализованы различными путями с GUI, что ничуть не умаляет удобства консоли.

clear                 # очистить консоль
df -h                 # показать статистику использования пространства на дисках
grep -i -n --color 'carousel' index.html css/style.css # найти слово carousel в двух указанных файлах (с игнором регистра), вывести строки с этим словом и номера строк (искомое слово подсветить)
grep word -r project  # найти слово word во всех файлах в папке project
find . -iname '*ind*' # найти в текущей папке (и подпапках) все файлы, имена которых содержат ind и показать списком
ls -a >> file.txt     # записать в file.txt результат вывода команды ls -a
ls src/less/mixins    # показать содержимое папки с указанным путем без перехода в неё
echo  "Some text"     # вывод текста в консоль 
chmod +x ./fileName   # сделать файл исполняемым 
whoami                # выводит имя пользователя 

Команды Linux, для работы с файлами

Эти команды используются для обработки файлов и каталогов.

33. ls

Очень простая, но мощная команда, используемая для отображения файлов и каталогов. По умолчанию команда ls отобразит содержимое текущего каталога.

34. pwd

Linux pwd — это команда для показывает имя текущего рабочего каталога. Когда мы теряемся в каталогах, мы всегда можем показать, где мы находимся.

Пример ример ниже:

35. mkdir

В Linux мы можем использовать команду mkdir для создания каталога.

По умолчанию, запустив mkdir без какой-либо опции, он создаст каталог в текущем каталоге.

36. cat

Мы используем команду cat в основном для просмотра содержимого, объединения и перенаправления выходных файлов. Самый простой способ использовать cat— это просто ввести » имя_файла cat’.

В следующих примерах команды cat отобразится имя дистрибутива Linux и версия, которая в настоящее время установлена на сервере.

37. rm

Когда файл больше не нужен, мы можем удалить его, чтобы сэкономить место. В системе Linux мы можем использовать для этого команду rm.

38. cp

Команда Cp используется в Linux для создания копий файлов и каталогов.

Следующая команда скопирует файл ‘myfile.txt» из текущего каталога в «/home/linkedin/office«.

39. mv

Когда вы хотите переместить файлы из одного места в другое и не хотите их дублировать, требуется использовать команду mv. Подробнее можно прочитать ЗДЕСЬ.

40.cd

Команда Cd используется для изменения текущего рабочего каталога пользователя в Linux и других Unix-подобных операционных системах.

41. Ln

Символическая ссылка или программная ссылка — это особый тип файла, который содержит ссылку, указывающую на другой файл или каталог. Команда ln используется для создания символических ссылок.

Команда Ln использует следующий синтаксис:

42. touch

Команда Touch используется в Linux для изменения времени доступа к файлам и их модификации. Мы можем использовать команду touch для создания пустого файла.

44. head

Команда head используется для печати первых нескольких строк текстового файла. По умолчанию команда head выводит первые 10 строк каждого файла.

45. tail

Как вы, возможно, знаете, команда cat используется для отображения всего содержимого файла с помощью стандартного ввода. Но в некоторых случаях нам приходится отображать часть файла. По умолчанию команда tail отображает последние десять строк.

46. gpg

GPG — это инструмент, используемый в Linux для безопасной связи. Он использует комбинацию двух ключей (криптография с симметричным ключом и открытым ключом) для шифрования файлов.

50. uniq

Uniq — это инструмент командной строки, используемый для создания отчетов и фильтрации повторяющихся строк из файла.

53. tee

Команда Linux tee используется для связывания и перенаправления задач, вы можете перенаправить вывод и/или ошибки в файл, и он не будет отображаться в терминале.

54. tr

Команда tr (translate) используется в Linux в основном для перевода и удаления символов. Его можно использовать для преобразования прописных букв в строчные, сжатия повторяющихся символов и удаления символов.

Сравнение чисел

В скриптах можно сравнивать числовые значения. Ниже приведён список соответствующих команд.

Сравнения пишем в обязательно пробелы в скобках

# eq - equal  
# ge - greater equal   
# gt - greater than     
# le - less equal  
# lt - less than  
# ne - not equal  

n1 -eq n2 # Возвращает истинное значение, если n1 равно n2.
n1 -ge n2 # Возвращает истинное значение, если n1 больше или равно n2.
n1 -gt n2 # Возвращает истинное значение, если n1 больше n2.
n1 -le n2 # Возвращает истинное значение, если n1 меньше или равно n2.
n1 -lt n2 # Возвращает истинное значение, если n1 меньше n2.
n1 -ne n2 # Возвращает истинное значение, если n1 не равно n2.

val1=6
if 
then
echo "The test value $val1 is greater than 5"
else
echo "The test value $val1 is not greater than 5"
fi

Переменные

Переменные в  могут содержаться в 3х областях видимости:

  1. Локальные переменные; Простая переменная внутри конкретного сценария. Например, определение переменной, доступ к значению и удаление:

    Также, вы можете объявить локальную переменную внутри функции. Такая переменная будет доступна только внутри этой ф-ции:

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

Подстановка параметров и результата работы команд

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

Получить результат значение переменной в другую переменную:

Примечание

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

Арифметика:

Раскрытие фигурных скобок — это механизм, с помощью которого можно генерировать строки произвольного вида. Генерация строки по шаблону (фигурные скобки могут быть вложенными):

Как использовать команду ps

Общий синтаксис команды ps выглядит следующим образом:

ps 

По историческим причинам и из соображений совместимости команда ps принимает несколько различных типов параметров:

  • Опции стиля UNIX, перед которыми стоит одна черточка.
  • Варианты стиля BSD, используемые без тире.
  • Длинные опции GNU, начинающиеся с двух тире.

Все типы опций могут быть смешанными, но в некоторых особых случаях могут возникать конфликты, поэтому лучше придерживаться одного типа опций. Опции BSD и UNIX могут быть сгруппированы.

В простейшей форме, когда используется без какой-либо опции, ps будет напечатано четыре столбца информации для минимум двух процессов, запущенных в текущей оболочке, самой оболочки и процессов, которые выполняются в оболочке при выполнении команды.

ps

Вывод включает в себя информацию о shell (bash) и процессе, запущенном в этой оболочке (введенная вами команда ps):

  PID TTY          TIME CMD
 1809 pts/0    00:00:00 bash
 2043 pts/0    00:00:00 ps

Четыре колонки помечены PID, TTY, TIMEи CMD.

PID- Идентификатор процесса. В большинстве случаев при запуске psкоманды наиболее важной информацией, которую ищет пользователь, является идентификатор процесса. Знание PID позволяет убить сбойный процесс.
TTY – Название управляющего терминала для процесса.
TIME – Совокупное время ЦП процесса, показанное в минутах и ​​секундах.
CMD – Имя команды, которая использовалась для запуска процесса.

Вывод выше не очень полезен, так как он не содержит много информации. Настоящая сила команды ps появляется при запуске с дополнительными опциями.

Команда ps принимает огромное количество опций, которые можно использовать для отображения определенной группы процессов и различной информации о процессе, но для повседневного использования требуется лишь несколько из них.

Команда ps чаще всего используется со следующей комбинацией параметров:

Форма BSD:

ps aux
  • Опция a указывает ps вывести на дисплей процессы всех пользователей, за исключением тех процессов, которые не связаны с терминалом и процессами группы лидеров.
  • В u – подставки для ориентированных на пользователя формате, который обеспечивает подробную информацию о процессах.
  • Опция x в ps перечисляет процессы без управляющего терминала. В основном это процессы, которые запускаются во время загрузки и работают в фоновом режиме.

Команда будет отображать информацию в одиннадцати столбцах USER, PID, %CPU, %MEM, VSZ, RSS, STAT, START, TTY, TIMEи CMD.

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.8  77616  8604 ?        Ss   19:47   0:01 /sbin/init
root         2  0.0  0.0      0     0 ?        S    19:47   0:00 
...

Мы уже объяснили метки PID, TTY, TIMEи CMD. Вот объяснение других меток:

  • USER – Пользователь, который запускает процесс.
  • %CPU- Процесс использования процессора .
  • %MEM – Процент резидентного установленного размера процесса к физической памяти на машине.
  • VSZ – Размер виртуальной памяти процесса в KiB.
  • RSS- Размер физической памяти , используемой процессом.
  • STAT- Код состояния процесса, который может быть Z (zombie), S (sleeping), R (running)  .. и т. д.
  • START – время, когда команда началась.

Чтобы напечатать дерево процессов, добавьте опцию f. Это укажет ps отобразить древовидное представление дочерних процессов.

ps auxf

Команда ps также позволяет вам сортировать вывод. Например, чтобы отсортировать вывод на основе использования памяти, вы бы использовали:

ps aux --sort=-%mem

форма  UNIX:

ps -ef
  • Опция e указывает ps отобразить все процессы.
  • f – полноформатный список, который содержит подробную информацию о процессах.

Команда будет отображать информацию в столбцах UID, PID, PPID, C, STIME, TIME и CMD.

UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 19:47 ?        00:00:01 /sbin/init
root         2     0  0 19:47 ?        00:00:00 
...

Метки, которые еще не объяснены, имеют следующее значение:

  • UID – То же USER, что и пользователь, который запускает процесс.
  • PPID – Идентификатор родительского процесса.
  • C- То же %CPU, что процесс загрузки процессора.
  • STIME- То же START, что и время начала команды.

Чтобы увидеть только процессы, запущенные от имени определенного пользователя, используйте следующую команду, где andreyex указано имя пользователя:

ps -f -U andreyex -u andreyex

Системные команды Linux

Эти команды используются для просмотра информации и управления, связанной с системой Linux.

1. uname

Команда Uname используется в Linux для поиска информации об операционных системах. В Uname существует много опций, которые могут указывать имя ядра, версию ядра, тип процессора и имя хоста.

Следующая команда uname с опцией  отображает всю информацию об операционной системе.

2. uptime

Информация о том, как долго работает система Linux, отображается с помощью команды uptime. Информация о времени безотказной работы системы собирается из файла ‘/proc/uptime‘. Эта команда также отобразит среднюю нагрузку на систему.

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

Полное руководство команды Uptime

3. hostname

Вы можете отобразить имя хоста вашей машины, введя  в своем терминале. С помощью опции  вы можете просмотреть ip-адрес компьютера. А с помощью параметра  вы можете просмотреть доменное имя.

4. last

Команда last в Linux используется для определения того, кто последним вошел в систему на вашем сервере. Эта команда отображает список всех пользователей, вошедших (и вышедших) из «/var/log/wtmp » с момента создания файла.

Вам просто нужно ввести «last» в своем терминале.

5. date

В Linux команда date используется для проверки текущей даты и времени системы. Эта команда позволяет задать пользовательские форматы для дат.

Рекомендуем статью Команда Date (Дата) в Linux с примерами использования

Например, используя «date +%D«, вы можете просмотреть дату в формате «ММ/ДД/ГГ«.

6. cal

По умолчанию команда cal отображает календарь текущего месяца. С помощью опции  вы можете просмотреть календарь на весь год.

9. reboot

Команда reboot используется для перезагрузки системы Linux. Вы должны запустить эту команду из терминала с правами суперпользователя sudo.

10. shutdown

Команда shutdown используется для выключения или перезагрузки системы Linux. Эта команда позволяет планировать завершение работы и уведомлять пользователей сообщениями о выключении и перезагрузке.

По умолчанию компьютер (сервер) выключится через 1 минуту. Вы можете отменить расписание, выполнив команду:

Немедленное отключение тоже возможно, для этого используется опция «now»

Команды Linux, связанные с процессом

Эти команды используются для обработки процессов Linux

55. ps

Команда Linux ps — это встроенный инструмент для отслеживания текущих процессов в системе. Он будет фиксировать состояние системы за один раз.

56. pmap

Команда pmap отображает карту использования памяти процесса или нескольких процессов. Pmap сообщает информацию об адресном пространстве или карте использования памяти процесса.

57. top

Команда top в Linux отображает запущенные процессы в системе. Эта команда широко используется для мониторинга нагрузки на сервер.

58. kill

Команда kill используется в Linux и других Unix-подобных операционных системах для завершения процессов без необходимости выхода из системы или перезагрузки компьютера.

59. killall

Команда killall может использоваться для отправки сигнала определенному процессу, используя его имя. Это означает, что если у вас запущено пять версий одной и той же программы, команда killall уничтожит все пять.

60. pkill

Аналогично команде killall, pkill посылает сигнал для завершения процесса с его именем. Начиная с Centos 7 рекомендуется использовать pkill.

61. fg и bg

Мы можем запускать задания в фоновом режиме без какого-либо вмешательства пользователя. Процессы, которые были остановлены каким-либо сигналом прерывания, могут быть продолжены в фоновом режиме с помощью команды bg. Команда fg похожа на команду bg, за исключением того, что вместо отправки команды в фоновом режиме она запускает их на переднем плане, занимает текущий терминал и ожидает завершения процесса.

Команды Bash

Основу работы в Bash составляют команды. Именно с помощью команд вы будете выполнять большинство действий над системой. Команды можно поделить на два типа. Это встроенные в оболочку, которые существуют только виртуально, мы рассматривали их в статье основные команды Bash, а также внешние команды — обычные утилиты или скрипты, расположенные в файловой системе.

Возвращаясь к встроенным командам, можно привести пример, вы не найдете в файловой системе команду cd. Ее нет, она встроена.

Обычные же команды находятся в файловой системе. Они могут находиться в одной из папок, указанных в переменной PATH. Для выполнения встроенной или внешней команды достаточно набрать ее имя, интерпретатор отлично справляется с поиском команд по папкам, указанным в PATH. Например:

Но если команда находится в одной из сторонних папок, то необходимо ввести ее полный адрес:

Иначе оболочка не сможет найти исполняемый файл команды.

Потоки

Файл, из которого осуществляется чтение, называется стандартным потоком ввода, а в который осуществляется запись — стандартным потоком вывода.

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

При перенаправлении потоков, вы можете указывать ссылки на определенные потоки. Например, перенаправим вывод и ошибки команды в файл:

Перенаправление потоков

Для перенаправления потоков используются основные команды: <>>><<<|. Рассмотрим как можно перенаправлять стандартные потоки.

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

Перенаправление потока ввода (прием данных):

Перенаправление вывода ошибок:

Примечание

Если вам нужно захватить вывод команды в переменную и при этом отобразить вывод на экране, используйте :

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

Передать процессу команда1 файл (созданный налету канал или файл /dev/fd/…), в котором находятся данные, которые выводит команда2:

Примеры

Логировать результат поиска и ошибки:

Эта конструкция позволяет читать из строки как из файла. Демонстрационный пример:

Создаем временный файл и записываем в него поток переданный скрипту:

А теперь откроем файл в текстовом редакторе с «отвязкой» (отключением) от терминала, подавляем вывод сообщений в терминал:

Написание функций Bash

Сначала нужно понять что такое функция в нашем контексте. Функция — это набор команд, объединенных одним именем, которые выполняют определенную задачу. Функция вызывается по ее имени, может принимать параметры и возвращать результат работы. Одним словом, функции Bash работают так же, как и в других языках программирования.

Синтаксис создания функции очень прост:

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

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

Простая функция

Давайте напишем небольшую функцию, которая будет выводить строку на экран:

$ vi function.sh

#!/bin/bash
printstr(){
echo «hello world»
}
printstr

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

Все работает, теперь усложним задачу, попробуем передать функции аргументы.

Аргументы функции

Аргументы функции нужно передавать при вызове, а читаются они точно так же, как и аргументы скрипта. Синтаксис вызова функции с параметрами bash такой:

имя_функции аргумент1 аргумент2 … аргументN

Как видите, все достаточно просто. Параметры разделяются пробелом. Теперь улучшим нашу функцию, чтобы она выводила заданную нами строку:

Можно сделать, чтобы параметров было несколько:

Есть и другой способ извлекать аргументы, как в Си, с помощью стека. Мы извлекаем первый аргумент, затем сдвигаем указатель стека аргументов на единицу и снова извлекаем первый аргумент. И так далее:

Возврат результата функции

Вы можете не только использовать функции с параметрами bash, но и получить от нее результат работы. Для этого используется команда return. Она завершает функцию и возвращает числовое значение кода возврата. Он может быть от 0 до 255:

Если вам нужно применить возврат значения функции bash, а не статус код, используйте echo. Строка не сразу выводится в терминал, а возвращается в качестве результата функции и ее можно записать в переменную, а затем использовать:

Экспорт функций

Вы можете сделать функцию доступной вне скрипта с помощью команды declare:

Затем запустите скрипт с помощью команды source:

Рекурсия

Вы можете вызвать функцию из нее же самой, чтобы сделать рекурсию:

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

Локальные переменные в функции

Если вы объявите обычную переменную в функции, то она будет доступной во всем скрипте, это удобно для возврата значения функции, но иногда может понадобиться сделать локальную переменную. Для этого существует команда local:

Библиотеки функций

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

test1(){
echo «Hello World from 1»;
}
test2(){
echo «Hello World from 2»;
}
test3(){
echo «Hello World from 3»;
}

Теперь создадим скрипт, который будет использовать наши функции. Импортировать библиотеку можно с помощью команды source или просто указав имя скрипта:

14 ответов

Лучший ответ

Еще один полезный совет по навигации — если, например, вы продолжаете переключаться из каталога (назовите его A) в другой (назовите его B), который в вашем случае находится на 7 каталогов вверх.

Итак, если вы находитесь в каталоге A:

Это вернет вас обратно в каталог A. расширится до предыдущего каталога, в котором вы были.

74

Florin Stingaciu
1 Ноя 2017 в 14:26

Вы можете попробовать это решение. Для меня это нормально:

Я сделал псевдоним в файле ~ / .barsh. И эта работа меня устраивает. Например, до трех папок. $ cd `cde 3`

Blow-Out
13 Авг 2015 в 18:13

Я сделал небольшую утилиту, которая немного упрощает навигацию по глубокой структуре каталогов: https://github.com/ianatha / вверх.

Установив , вы можете:

1

thatha
11 Фев 2020 в 02:18

Вы можете добавить к своему следующую функцию:

Таким образом, использование будет просто:

1

doberoi96
1 Окт 2017 в 03:03

Для рыбаков,

И сохраните его в: ~ / .config / fish / functions / cdd.fish

И просто Подняться на 3 каталога.

1

chriz
14 Сен 2017 в 15:06

Эта отличная функция поддерживает подъем в обоих направлениях .

Если вы находитесь в / a / b / c / d , то «вверх 1» переместит вас в / a / b / c и так далее. Это довольно стандартно и описано в большинстве других ответов.

Теперь о специальной части; использование отрицательных чисел уводит вас с другой стороны. Итак, если вы находитесь в / a / b / c / d , «up -1» приведет вас к / a и так далее.

Доступно для загрузки / установки на github.

1

rouble
9 Май 2017 в 16:02

Хм, я так не думаю.

Но вы можете написать (и так далее) вместо 7 раз cd ..

1

E. Lüders
30 Авг 2012 в 13:43

2

Waleed Khan
30 Авг 2012 в 13:44

Вы можете сделать это так

Существует классная статья о некоторых приемах, которые можно применить для улучшения навигации.

3

Maksim Skurydzin
30 Авг 2012 в 13:43

Не помню, откуда я скопировал эту функцию, но у меня она отлично работает (например, вы можете вставить файл )

Например чтобы перейти на 7 каталогов вверх, необходимо набрать

4

dav
4 Дек 2015 в 14:27

Вот небольшое улучшение, которое я обнаружил:

Обычно, когда вы возвращаетесь на один каталог с помощью cd .., вы в конечном итоге переходите на один каталог вперед. Чтобы это работало, вам нужно использовать функции, а не псевдонимы, поэтому вместо:

Ты можешь использовать:

Однако после его использования быстро становится очевидным, что вам не хватает завершения команды для этой функции, что делает ее гораздо менее полезной, чем могла бы быть. Таким образом, я вернулся и добавил свои собственные функции завершения bash для этой функции, которые можно вставить в ваш ~ / .bashrc или любой файл (например, ~ / .bash_completion), который вызывается из вашего ~ / .bashrc, если вы хотите избежать беспорядок. Вот код завершения:

5

RussellStewart
14 Апр 2013 в 08:35

Если есть команда, которую я часто использую, я просто сделаю псевдоним.

Вы могли напечатать

Затем вы можете просто использовать для перехода на один уровень вверх и для перехода на два уровня.

7

RussellStewart
14 Июл 2013 в 17:55

Вы можете использовать , чтобы запомнить один каталог, и , чтобы вернуться в него.

8

Chakalaka
30 Авг 2012 в 13:47

Сделайте псевдоним (у вас ~ / .bashrc)

И используйте:

UPD: Или сделайте более мощный вариант, cd к имени каталога в текущем пути:

Использование:

22

Grigory K
2 Апр 2018 в 12:58

Сравнение строк

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

str1 = str2   # Проверяет строки на равенство, возвращает истину, если строки идентичны.
str1 != str2  # Возвращает истину, если строки не идентичны.

# операторы «>» и «<» необходимо экранировать с помощью обратной косой черты,
str1 \< str2   # Возвращает истину, если str1 меньше, чем str2.
str1 \> str2   # Возвращает истину, если str1 больше, чем str2.

-n str1       # Возвращает истину, если длина str1 больше нуля.
-z str1       # Возвращает истину, если длина str1 равна нулю.  

#!/bin/bash

user ="likegeeks"
if 
then
echo "The user $user  is the current logged in user"
fi
Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Все про сервера
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: