Bash — различия между версиями

Материал из Вікі Фаланстэра
Перейти к: навигация, поиск
(Новая страница: «==Горячие клавиши и прочие фишки== Стандартно в bash используются горячие клавиши Emacs. '''На…»)
 
Строка 43: Строка 43:
  
 
*2> - перенаправление потока ошибок. Используется для упреждения вывода в консоль сообщений об ошибках.
 
*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}
  
  
 
[[Category:Линуксовки в Фаланстере]]
 
[[Category:Линуксовки в Фаланстере]]

Версия 19:04, 19 января 2013

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

Стандартно в 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}