Страница 2 из 6
Пример 1
$ echo hi{BBB,AAA}there
hiBBBthere,hiAAAthere
Пример2
$ echo a{d,c,b}e
ade ace abe
Пример 3
$ echo 1 to 5 is {1..5}
1 to 5 is 1 2 3 4 5
$ echo 1 to 8 by 2 {1..8}
1 to 8 by 2 1 2 3 4 5 6 7 8
Использование скобок ( ) показано на следующем примере – выполнение группы команд.
$ (date; w;) Результат
Чт 22 июл 2021 08:31:12 MSK
08:31:12 up 3:00, 1 user, load average: 0,02, 0,14, 0,18
USER TTY FROM [email protected] IDLE JCPU PCPU WHAT
max tty2 tty2 05:31 2:59m 0.11s 0.10s /usr/libexec/gn
Использование скобок [ ] и (( )) показано на примере простого скрипта.
$ cat >skobki.sh
#!/bin/bash
X=1
while [ $X -lt 5 ]
do
echo "–> $X <–"
X=$(( $X+1 ))
done
exit 0
$ chmod +x skobki.sh
$ ./skobki.sh
–-> 1 <–
–-> 2 <–
–-> 3 <–
–-> 4 <–
2.6 Управляющие последовательности символов.
Распознаются и интерпретируются в следующих контекстах. Символьная строка в форме $ '…'
Аргументы в командах echo -e , printf %b
(Подставить управляющие последовательности символов в символьные строки).
Форматирующие строки, указываемые в команде printf ( управляющие последовательности символов в заданном формате экранируются).
a Звонок
b Возврат на 1 позицию
c Подавить знак новой строки
e Переход
E Переход
f Перевод страницы
n Перевод строки
r Возврат каретки
t Табуляция
uHHHH Символ HHHH в Юникоде
’ Одиночная кавычка
” Двойная кавычка
? Знак вопроса
\ Обратная косая черта
Простой пример
$ echo -e "Hello Friend"
Hello Friend
$ echo -e "HellonFriend"
Hello
Friend
$ echo -e "Hello Friend" ?
Hello Friend ?
2.7 Формы команд.
–Выполнить команду в фоновом режиме $ cmd &.
–Выполнить команды группой в текущей оболочке {cmd1; cmd2}.
Пример 1
$ { who;pwd; }
max tty7 2019-08-12 05:17 (:0)
/home/max
–Выполнить команды в подоболочке (cmd1 ;cmd2)
Пример 2
$ (date; who; pwd) > logfile
$ cat logfile
Сб авг 3 09:03:21 MSK 2019
max tty7 2019-08-03 08:23 (:0)
/home/max
–Передать выход cmd1 на вход cmd2. $ cmd1 | cmd2
Пример 3, найти все файлы с расширением .sh и
сделать их исполняемыми
$ find *.sh -type f |xargs chmod +x
Проверка
$ ls -l *.sh
–Результат команды cmd2 как аргумент cmd1.
$ cmd1 `cmd2`
$ cat `pwd`
cat: /home/max: Это каталог
–Подстановка команд сmd1 $(cmd2)
Пример 4, создадим файл с датой
$ touch f01 $(date)
$ ls -l f01
–rw-rw-r– 1 max max 0 авг 3 09:39 f01
Числовой результат в качестве аргумента
cmd $ (выражение)
–Логическое И. $ cmd1 && cmd2
–Логическое ИЛИ $ cmd1 || cmd2
–Логическое НЕ $!cmd
Пример 5
$ date || touch f81.txt; ls f81.txt
Сб 30 мая 2020 06:43:33 MSK
ls: невозможно получить доступ к 'f81.txt': Нет такого файла или каталога
$ date && touch f81.txt; ls f81.txt
Сб 30 мая 2020 06:43:54 MSK
f81.txt
2.8 Простая переадресация ввода-вывода.
Ниже отображены формы переадресации ввода-вывода
cmd>file Направить результат команды в файл.
Пример 1
$ date >f30.txt; cat f30.txt
Вт июн 11 22:10:14 MSK 2019
cmd>> file Добавить результат команды в файл
Пример 2
$ date >>f30.txt; cat f30.txt
Вт июн 11 22:10:14 MSK 2019
Вт июн 11 22:11:45 MSK 2019
cmd <file Взять входные данные для команды из
файла.
Пример 3
$ cat <f30.txt
Вт июн 11 22:10:14 MSK 2019
Вт июн 11 22:11:45 MSK 2019
Пример 4 Встраиваемая строка.
Представить текст заданного слова в качестве входных данных для указанной команды.
$ cat <<<"Privet"
Privet
Пример 5
cmd <>file Записать в файл результат команды,
содержимое файла не нарушается.
$ date <> f30.txt; cat f30.txt
Вт июн 11 21:58:17 MSK 2019
Вт июн 11 17:15:49 MSK 2019
cmd >| file Направить результат команды в файл
переписав его содержимое.
Пример 5 Направить результаты в файл, переписав его содержимое.
$ date
Пн 12 июл 2021 08:02:24 MSK
$ cat >f30.txt
Hello
$ date >| f30.txt
$ cat f30.txt
Пн 12 июл 2021 08:03:13 MSK
2.9 Переадресация ввода-вывода с использованием дескрипторов файлов.
Файловый дескриптор – целое число,которое указывает доступ к файлу.
Стандартный ввод stdin дескриптор 0.
Стандартный вывод stdout дескриптор 1.
Стандартный вывод ошибок stderr дескриптор 2. Клавиатура stdin файл.
Экран stdout файл. Файловый дескриптор привязан к индефикатору процесса.
Пример
# sleep 1000 &
[2] 5021
# cd /proc/5021/fd ; ls
0 1 2
cmd >&n Направить результат команды в файл с
дескриптором n.
Пример 1 # дескриптор 1 стандартный вывод.
$ date >&1
Вт июн 11 22:05:51 MSK 2019
cmd >&– Закрыть стандартный вывод
$ date >&-
date: ошибка записи: Неправильный дескриптор файла.
cmd<&n Взять входные данные для указанной команды из файла с заданным дескриптором n.
$ cat >file1<&0
privet
$ cat file1
privet
cmdm<&n Входные данные из файла с дескриптором m
поступают из файла с дескриптором n.
$ cat >file1 2<&0
privet 4 # Набираем с клавиатуры
$ cat file1
privet 4
cmd<&– Закрыть стандартный ввод.
$ pwd<&-
/home/max1
$
cmd<&n Направить содержимое файла с заданным дескриптором n в стандартный ввод,получив сначала копию, а затем закрыв оригинал.
cmd>&n- Направить содержимое файла с заданным дескриптором n в стандартный вывод,получив сначала копию,а затем закрыв оригинал.
Пример Напишем следующий скрипт
$ cat f2.sh
#!/bin/sh
read str <&0
echo "$str" | festival –tts –language russian
Запускаем скрипт
$ sh f2.sh Набираем в терминале фразу
Привет друзья. Нажимаем Enter и слышим
«Привет друзья»
Пример 2
$ cat f5.txt
Hello my friend
$ read str <f5.txt |echo "$str" >&1-
Hello my friend
Использование команды exec с дескрипторами.
exec 0
Создадим под root myfile с двумя командами.
# cat >myfile
pwd; date
Выполнить команды из файла вместо стандартного ввода.
# exec 0<myfile
# pwd; date
/root
exec 1
cat myscript1.sh
#!/bin/sh
exec 1>outfile
0echo "This a test"
$ cat ./outfile
This is a test
exec 3
$ cat myscript3.sh
#!/bin/sh
exec 3> myfile
echo "Privet" >&3
cat ./myfile
$sh myscript.sh
Privet
Примечание возможно использование команды exec c дескрипторами 0-9.
2.10 Многократная переадресация ввода-вывода.
Направить стандартный вывод ошибок в заданный
файл cmd 2>file Пример 1
$ ls -l /root/ 2>ls_er; cat ls_er
ls: невозможно открыть каталог '/root/': Отказано в доступе.
Направить стандартный вывод ошибок и данных в
заданный файл.
cmd >file 2>&1 Пример 2
$ ls -l f1.txt; ls -l /root/ 2>&1 >ls1
–rw-rw-r– 1 max1 max1 6 мая 9 07:21 f1.txt
ls: невозможно открыть каталог '/root/': Отказано в доступе.
$ cat ls1
ls: невозможно открыть каталог '/root/': Отказано в доступе.
Присоединить стандартный вывод данных и