Bash

Материал из Вікі Фаланстэра
Перейти к: навигация, поиск

Горячие клавиши и прочие фишки

Стандартно в bash используются горячие клавиши Emacs.

Например:

  • TAB - автодополнение
  • ctrl+a - переход в начало строки
  • ctrl+e - переход в конец строки
  • ctrl+k - удаление строки
  • ctrl+r - поиск назад по истории команд
  • alt+r или ctrl+/- отмена последнего действия
  • ^ - результат замены (например, если была команда ls /home и нужно заменить на сd /home --> ls^cd^)


Выполнение нескольких команд в строке: <первая команда> <логический оператор> <вторая команда>,

где <логический оператор>:

  • && - выполнить вторую команду, если первая команда была успешной (логическое И)
  • || - выполнить первую команду или второю (исключающее ИЛИ)
  •  ; - выполнить первую команду, а затем (независимо от результатов выполнения первой) вторую

Понятие каналов в bash

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

Общий синтаксис:

  • > - перенаправление выходного потока в файл, то есть запись в файл. При этом, если файл существовал ранее, то все его содержимое затирается новым.
Пример: ls -al > list.txt
  • >> - то же самое, но при этом новое содержимое добавляется к старому.
  • 2> - перенаправление потока ошибок. Используется для упреждения вывода в консоль сообщений об ошибках.

Основы синтаксиса

Работа с файлами

Очистка файла:

> file

Замена содержимого:

echo "some string" > file

Добавление содержимого:

echo "foo bar baz" >> file

Без новой строки в конце:

echo -n "foo bar baz" >> file 

Прочитать первую строку файла, присвоить переменной line:

read -r line < file
-r: "сырой формат"

Построчное чтение файла:

while read -r line; do
   #тут что-то делаем со строкой
done < file

Так тоже можно:

cat file | while IFS= read -r line; do
   # do something with $line
done

Читаем рандомную строку, присваиваем ее переменной:

read -r random_line < <(shuf file)

<(...) - создает свой канал, соединяет его выход со входом read файловый дескриптор


Подсчет числа строк, слов, символов в тескте + присвоение переменным

read lines words chars _ < <(wc file-with-5-lines)

Получение заданных значений из переменных, файлов и т.п. Пусть $info="20 packets in 10 seconds" Требуется получить $packets = 20; $seconds = 10;

Можно так:

packets=$(echo $info | awk '{ print $1 }')
time=$(echo $info | awk '{ print $4 }')

А можно и так:

read packets _ _ time _ <<< "$info"
<<< - оператор, позволяющий подставлять строки в однострочниках как  строки, которые подаются на стандартный вход

Получение размера файла:

size=$(wc -c < file)

Получение имени файла из пути $path = /path/to/file.ext:

filename=${path##*/}
ищет с начала; здесь filename - то, что осталось!

Получение директории из пути:

dirname=${path%/*}
ищет с конца; результат - остаток.

Быстрое копирование/перемещение файлов:

cp /path/to/file /path/to/file_copy
cp /path/to/file{,_copy}
mv /path/to/file{,_old}