Bash — различия между версиями
(Новая страница: «==Горячие клавиши и прочие фишки== Стандартно в bash используются горячие клавиши Emacs. '''На…») |
|||
(не показаны 3 промежуточные версии этого же участника) | |||
Строка 1: | Строка 1: | ||
+ | =Основы синтаксиса= | ||
+ | |||
+ | ==Работа с файлами== | ||
+ | |||
+ | Очистка файла: | ||
+ | |||
+ | > 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} | ||
+ | |||
+ | =Разное= | ||
+ | |||
==Горячие клавиши и прочие фишки== | ==Горячие клавиши и прочие фишки== | ||
Текущая версия на 19:08, 19 января 2013
Содержание
Основы синтаксиса
Работа с файлами
Очистка файла:
> 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}
Разное
Горячие клавиши и прочие фишки
Стандартно в 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> - перенаправление потока ошибок. Используется для упреждения вывода в консоль сообщений об ошибках.