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}