From fce561698d84cdeac00618b0a722e73f63416bf9 Mon Sep 17 00:00:00 2001 From: DMITRY SERGEEV <64420007+sergeevdm@users.noreply.github.com> Date: Tue, 30 Aug 2022 21:53:33 +0300 Subject: [PATCH] Create README.md --- README.md | 454 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 454 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..831171b --- /dev/null +++ b/README.md @@ -0,0 +1,454 @@ +# Linux-Commands +Шпаргалка по командам + +# Шпаргалка по bash + +### Добавляйте свои команды и остальные полезности через `Pull request`. + +Шпаргалка основных команд Git Bash, терминала OSX, терминала linux. + +## Суть + +Консоль — удобный и быстрый инструмент управления компьютером. Вводим команду текстом, получаем результат или сообщение об ошибке с указанием в чём ошибка. + +Работая с консолью, мы всегда «находимся» в какой-то папке (это указано в строке над курсором). Если там написано `~`, то мы в папке пользователя (зависит от настроек Windows, чаще всего это `C:/Users/ВАШЕИМЯПОЛЬЗОВАТЕЛЯ/`), если там `/d/projects`, мы в папке `D:/projects`. + +## Файловая система + +### Просмотр содержимого папки + +```bash +pwd # выводит текущи путь (сокращение от PRINT WORK DIRECTORY) +ls # показать содержимое папки +ls -l # отображает расширенную информацию о файлах и папках +ls -a # то же, но показывать и скрытые файлы и папки +ls -a -1 # то же, но в один столбец +ls -hF -1 --sort=extension # показать содержимое папки «красиво, в один столбец» +ls build/css # показать содержимое папки ТЕКУЩАЯ_ПАПКА/build/css +ls /d/projects # показать содержимое папки D:/projects +``` + +### Перемещение по файловой системе + +Пользователь всегда находится в какой-то папке, она (или полный путь) всегда показана до области ввода команд. + +```bash + +cd projects # переход в папку projects, которая есть текущей папке +cd /d/projects # windows: переход в папку projects, расположенную по адресу D:/projects +cd /c/Program\ Files # windows: переход в C/:Program Files +cd . # текущая директория +cd .. # переход к родительской папке +cd ~ # домашняя директория +cd - # переход к последней рабочей папке +``` + +Чтобы не набирать имя папки целиком, наберите первые пару символов и нажмите Tab — произойдет автодополнение (если нет двух папок, начинающихся с введенных символов, иначе будут показаны сами эти папки). Справедливо для любой команды. + +### Создание папок и файлов + +```bash +mkdir project # создать папку с именем «project» +mkdir project project/css project/js # создать несколько папок +mkdir -p project/{css,js} # то же, что выше + +touch index.html # создать файл +touch index.html css/style.css js/script.js # создать файлы (папки css/ и js/ должны уже существовать) +``` + +### Копирование файлов + +```bash +cp index.html catalog.html # копирование файла index.html в тот же каталог с переименованием в catalog.html +cp index.html old/ # копирование файла index.html в папку old/ (все произойдет в текущей папке) +cp temp/ temp2/ -r # дублирование каталога +``` + + +### Переименование или перемещение файлов + +```bash +mv index.html old # перемещение файла в папку +mv index.html old/new_name.txt # перемещение файла в папку с переименованием файла +mv order.txt orderNew.txt # переименовать файл +``` + + +### Удаление папок и файлов + +```bash +rm ghost.png # удалить файл +rm -rf old # удалить папку и всё из нее +``` + + +## Алиасы + +Для команд можно создавать алиасы (синонимы). +Для этого в папке пользователя (OSX и linux) или в C:/Users/ИМЯ_ПОЛЬЗОВАТЕЛЯ/.bashrc (Windows) нужно вписать строки, наподобие alias pro='cd /d/projects' (одна строка в файле — один алиас).. + +```bash +alias # отобразит алиасы, которые уже заданы в системе +alias c='clear' # создаст алиас который будет очищать консоль +unalias c # удалит алиас " c " +unalias -a # удалит все записанные алиасы +``` + + +## Разное + +Подборка команд, показывающих бОльшую скорость работы с консолью, чем с GUI или просто удобных команд. Многие из них могут быть реализованы различными путями с GUI, что ничуть не умаляет удобства консоли. + +```bash +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 # выводит имя пользователя +``` + +## Использование переменных +Переменные позволяют хранить в файле сценария информацию, например — результаты работы команд для использования их другими командами. + +Существуют два типа переменных, которые можно использовать в bash-скриптах: + +1. Переменные среды - переменные установленые в среде +```bash +echo $HOME +echo "Env variable $HOME" + +``` +2. Пользовательские переменные - хранят значение до тех пор, пока не завершится выполнение сценария. + +```bash +#!/bin/zsh + +grade=5 +person="Adam" +echo "$person is a good boy, he is in grade $grade" +``` +## Подстановка команд в переменные + +Одна из самых полезных возможностей bash-скриптов — это **возможность извлекать информацию из вывода команд и назначать её переменным**, что позволяет использовать эту информацию где угодно в файле сценария. + +Сделать это можно двумя способами. + +1. С помощью значка обратного апострофа «`» +```bash +mydir=`pwd` +``` +2. С помощью конструкции $() +```bash +mydir=$(pwd) +``` + +А скрипт, в итоге, может выглядеть так: +```bash +#!/bin/bash + +mydir=$(pwd) +echo $mydir +``` +В ходе его работы вывод команды pwdбудет сохранён в переменной mydir, содержимое которой, с помощью команды echo, попадёт в консоль. + +## Математические операции + +Для выполнения математических операций в файле скрипта можно использовать конструкцию вида `$((a+b))` + +```bash +#!/bin/bash + +var1=$(( 5 + 5 )) +echo $var1 + +var2=$(( $var1 * 2 )) +echo $var2 +``` + +## Управляющая конструкция if-then + +В некоторых сценариях требуется управлять потоком исполнения команд. Например, если некое значение больше пяти, нужно выполнить одно действие, в противном случае — другое. Подобное применимо в очень многих ситуациях, и здесь нам поможет управляющая конструкция if-then. В наиболее простом виде она выглядит так + +```bash +if команда +then +команды +fi + +#!/bin/bash +if pwd +then +echo "It works" +fi +``` + +Пример: надо найти некоего пользователя в `/etc/passwd`, и если найти его удалось, сообщить о том, что он существует. + +```bash +#!/bin/bash + +user=likegeeks +if grep $user /etc/passwd +then +echo "The user $user Exists" +fi +``` + +## Управляющая конструкция if-then-else + +Для того, чтобы программа смогла сообщить и о результатах успешного поиска, и о неудаче, воспользуемся конструкцией `if-then-else`. Вот как она устроена: + +```bash +if команда +then +команды +else +команды +fi +``` +Если первая команда возвратит ноль, что означает её успешное выполнение, условие окажется истинным и выполнение не пойдёт по ветке else. В противном случае, если будет возвращено что-то, отличающееся от нуля, что будет означать неудачу, или ложный результат, будут выполнены команды, расположенные после else. + +```bash +#!/bin/bash + +user=anotherUser +if grep $user /etc/passwd +then +echo "The user $user Exists" +else +echo "The user $user doesn’t exist" +fi +``` + +## Конструкция CASE +Если вы столкнулись с парой различных возможных действий, то использование оператора case может быть более полезным, чем вложенные операторы if. Для более сложных условий используйте пример, как показано ниже +```bash +case "$extension" in + "jpg"|"jpeg") echo "It's image with jpeg extension." ;; + "png") echo "It's image with png extension." ;; + "gif") echo "Oh, it's a giphy!" ;; + *) echo "Woops! It's not image!" ;; +esac +``` + +## Циклы + +В Bash есть четыре типа циклов: for, while, until и select. + +- FOR +```bash +# 1 +for arg in elem1 elem2 ... elemN +do + # statements +done + +# 2 +for i in {1..5}; do echo $i; done + +# 3 +for (( i = 0; i < 10; i++ )); do + echo $i +done + +# 4 +for FILE in $HOME/*.bash; do + mv "$FILE" "${HOME}/scripts" + chmod +x "${HOME}/scripts/${FILE}" +done +``` + +- WHILE - Цикл while проверяет условие и перебирает последовательность команд, пока это условие истинно. Условие - это не что иное, как первичное значение, используемое в условиях if..then. +```bash +while [[ condition ]] +do + # statements +done + +# Squares of numbers from 0 through 9 +x=0 +while [[ $x -lt 10 ]]; do # value of x is less than 10 + echo $(( x * x )) + x=$(( x + 1 )) # increase x +done +``` + +- UNTIL - Цикл until - полная противоположность цикла while. Какое-то время он проверяет условие теста, но продолжает цикл, пока это условие ложно +```bash +until [[ condition ]]; do + #statements +done +``` +- SELECT - Цикл выбора помогает нам организовать пользовательское меню. Он имеет почти тот же синтаксис, что и цикл for +```bash +select answer in elem1 elem2 ... elemN +do + # statements +done +``` +В этом примере пользователю задается вопрос, какой диспетчер пакетов он хотел бы использовать. Затем он спросит, какой пакет мы хотим установить, и, наконец, приступит к его установке. + +```sh +PS3="Choose the package manager: " +select ITEM in bower npm gem pip +do + echo -n "Enter the package name: " && read PACKAGE + case $ITEM in + bower) bower install $PACKAGE ;; + npm) npm install $PACKAGE ;; + gem) gem install $PACKAGE ;; + pip) pip install $PACKAGE ;; + esac + break # avoid infinite loop +done +``` + +- LOOP CONTROL - Бывают ситуации, когда нам нужно остановить цикл до его нормального завершения или перешагнуть через итерацию. В этих случаях мы можем использовать встроенные в оболочку операторы break и continue. + +Оператор `break` используется для выхода из текущего цикла до его завершения +Оператор `continue` проходит одну итерацию +```sh +for (( i = 0; i < 10; i++ )); do + if [[ $(( i % 2 )) -eq 0 ]]; then continue; fi + echo $i +done +``` + +## Сравнение чисел + +В скриптах можно сравнивать числовые значения. Ниже приведён список соответствующих команд. + +Сравнения пишем в [ ] обязательно пробелы в скобках + +```bash +# 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 [ $val1 -gt 5 ] +then +echo "The test value $val1 is greater than 5" +else +echo "The test value $val1 is not greater than 5" +fi +``` + +## Сравнение строк + +В сценариях можно сравнивать и строковые значения. +Операторы сравнения выглядят довольно просто, однако у операций сравнения строк есть определённые особенности, которых мы коснёмся ниже. Вот список операторов. + +```bash +str1 = str2 # Проверяет строки на равенство, возвращает истину, если строки идентичны. +str1 != str2 # Возвращает истину, если строки не идентичны. + +# операторы «>» и «<» необходимо экранировать с помощью обратной косой черты, +str1 \< str2 # Возвращает истину, если str1 меньше, чем str2. +str1 \> str2 # Возвращает истину, если str1 больше, чем str2. + +-n str1 # Возвращает истину, если длина str1 больше нуля. +-z str1 # Возвращает истину, если длина str1 равна нулю. + +#!/bin/bash + +user ="likegeeks" +if [ $user = $USER ] +then +echo "The user $user is the current logged in user" +fi +``` + +## Проверки файлов + +Kоманды позволяют проверять различные условия, касающиеся файлов + +```bash +-d file # Проверяет, существует ли файл, и является ли он директорией. +-e file # Проверяет, существует ли файл. +-f file # Проверяет, существует ли файл, и является ли он файлом. +-r file # Проверяет, существует ли файл, и доступен ли он для чтения. +-s file # Проверяет, существует ли файл, и не является ли он пустым. +-w file # Проверяет, существует ли файл, и доступен ли он для записи. +-x file # Проверяет, существует ли файл, и является ли он исполняемым. +file1 -nt file2 # Проверяет, новее ли file1, чем file2. +file1 -ot file2 # Проверяет, старше ли file1, чем file2. +-O file # Проверяет, существует ли файл, и является ли его владельцем текущий пользователь. +-G file # Проверяет, существует ли файл, и соответствует ли его идентификатор группы идентификатору группы текущего пользователя. + +#!/bin/bash + +mydir=/home/likegeeks + +if [ -d $mydir ] # если файл сущетсвует и он является директорией +then +echo "The $mydir directory exists" # выводим сообщение +cd $mydir # переходим в него +ls # отображаем содержимое +else # ИНАЧЕ +echo "The $mydir directory does not exist" +fi +``` + +## Операторы + +Пайпы **|** - передает результат выполненной инструкции следующему пайпу +```bash +# command1 | command2 | command3 +ls -l | grep .md$ | less +``` + +Точка с запятой **;** - выполняет команды последовательно +```bash +# command2 will be executed after command1 +command1 ; command2 +``` +Амперсанд **&** - оболочка выполняет команду асинхронно в подоболочке. Другими словами, эта команда будет выполняться в фоновом режиме + +Двойной амперсанд (И) **&&** - вторая команды будет выполнена только в случае УСПЕШНОГО заверения первой команды +```bash +# command2 will be executed if, and only if, command1 finishes successfully (returns 0 exit status) +command1 && command2 +``` + +Двойной пайп (ИЛИ) - вторая команды будет выполнена только в случае НЕУДАЧНОГО заверения первой команды +```bash +# command2 will be executed if, and only if, command1 finishes unsuccessfully (returns code of error) +command1 || command2 +``` + +Тестовые **[ ]** - Эти выражения помогают нам указать результаты условного выражения. Используются обычно в блоках if +```bash +# Single-line +if [[ 1 -eq 1 ]]; then echo "true"; fi + +# Multi-line +if [[ 1 -eq 1 ]]; then + echo "true" +fi + +# Single-line +if [[ 2 -ne 1 ]]; then echo "true"; else echo "false"; fi + +# Multi-line +if [[ 2 -ne 1 ]]; then + echo "true" +else + echo "false" +fi +```