параметров.
(обратно)
sed -e 'N;s/.*/[&]/' << EOF # Встроенный документ line1 line2 EOF # OUTPUT: # [line1 # line2]
echo
awk '{ $0=$1 "\n" $2; if (/line.1/) {print}}' << EOF line 1 line 2 EOF # OUTPUT: # line # 1
# Спасибо S.C.
exit 0 (обратно)
~/.[b]ashrc # Имя ~./bashrc будет соответствовать данному шаблону ~/.ba?hrc # Аналогично. ~/.bashr* # Аналогично.
# Установка ключа "dotglob" отключает такое поведение интерпретатора. # Спасибо S.C. (обратно)
ITERATIONS=3 # Количество вводимых значений. icount=1
my_read () { # При вызове my_read varname, # выводит предыдущее значение в квадратных скобках, # затем просит ввести новое значение.
local local_var
echo -n "Введите говое значение переменной " eval 'echo -n "[$'$1'] "' # Прежнее значение. read local_var [ -n "$local_var" ] && eval $1=\$local_var
# Последовательность "And-list": если "local_var" не пуста, то ее значение переписывается в "$1". }
echo
while [ "$icount" -le "$ITERATIONS" ] do my_read var echo "Значение #$icount = $var" let "icount += 1" echo done
# Спасибо Stephane Chazelas за этот поучительный пример.
exit 0 (обратно)
recursive_function () { (( $1 < $2 )) && recursive_function $(( $1 + 1 )) $2; # Увеличивать 1-й параметр до тех пор, #+ пока он не станет равным, или не превысит, второму параметру. }
recursive_function 1 50000 # Глубина рекурсии = 50,000! # Само собой -- Segmentation fault.
# Рекурсия такой глубины может "обрушить" даже программу, написанную на C, #+ по исчерпании памяти, выделенной под сегмент стека.
# Спасибо S.C.
exit 0 # Этот сценарий завершает работу не здесь, а в результате ошибки Segmentation fault. (обратно)
38
Команда userdel завершится неудачей, если удаляемый пользователь в этот момент работает с системой (обратно)39
Дополнительную информацию по записи компакт-дисков, вы найдете в статье Алекса Уизера (Alex Wither): Creating CDs, в октябрьском выпуске журнала Linux Journal за 1999 год. (обратно)40
Утилита mke2fs, с ключом -c, так же производит поиск поврежденных блоков. (обратно)41
Пользователи небольших, десктопных Linux-систем предпочитают утилиты попроще, например tar. (обратно)42
NAND -- логическая операция "И-НЕ". В общих чертах она напоминает вычитание. (обратно)43
Замещающая команда может быть внешней системной командой, внутренней (встроенной) командой или даже функцией в сценарии. (обратно)44
дескриптор файла -- это просто число, по которому система идентифицирует открытые файлы. Рассматривайте его как упрощенную версию указателя на файл. (обратно)45
При использрвании дескриптора с номером 5 могут возникать проблемы. Когда Bash порождает дочерний процесс, например командой exec, то дочерний процесс наследует дескриптор 5 как "открытый" (см. архив почты Чета Рамея (Chet Ramey), SUBJECT: RE: File descriptor 5 is held open) Поэтому, лучше не использовать этот дескриптор. (обратно)46
В качестве простейшего регулярного выражения можно привести строку, не содержащую никаких метасимволов. (обратно)47
[47]Поскольку с помощью sed, awk и grep обрабатывают одиночные строки, то обычно символ перевода строки не принимается во внимание. В тех же случаях, когда производится разбор многострочного текста, метасимвол "точка" будет соответствовать символу перевода строки. #!/bin/bashsed -e 'N;s/.*/[&]/' << EOF # Встроенный документ line1 line2 EOF # OUTPUT: # [line1 # line2]
echo
awk '{ $0=$1 "\n" $2; if (/line.1/) {print}}' << EOF line 1 line 2 EOF # OUTPUT: # line # 1
# Спасибо S.C.
exit 0 (обратно)
48
Подстановка таких имен файлов возможна, но только при условии, что символ точки будет явно присутствовать в шаблоне. ~/[.]bashrc # Не будет соответствовать имени ~/.bashrc ~/?bashrc # То же самое. # Метасимволы не могут соответствовать символу точки при подстановке имен файлов.~/.[b]ashrc # Имя ~./bashrc будет соответствовать данному шаблону ~/.ba?hrc # Аналогично. ~/.bashr* # Аналогично.
# Установка ключа "dotglob" отключает такое поведение интерпретатора. # Спасибо S.C. (обратно)
49
Имеет тот же эффект, что и именованные каналы (временный файл), фактически, именованные каналы некогда использовались в операциях подстановки процессов. (обратно)50
Механизм косвенных ссылок на переменные (см. Пример 34-2) слишком неудобен для передачи аргументов по ссылке. #!/bin/bashITERATIONS=3 # Количество вводимых значений. icount=1
my_read () { # При вызове my_read varname, # выводит предыдущее значение в квадратных скобках, # затем просит ввести новое значение.
local local_var
echo -n "Введите говое значение переменной " eval 'echo -n "[$'$1'] "' # Прежнее значение. read local_var [ -n "$local_var" ] && eval $1=\$local_var
# Последовательность "And-list": если "local_var" не пуста, то ее значение переписывается в "$1". }
echo
while [ "$icount" -le "$ITERATIONS" ] do my_read var echo "Значение #$icount = $var" let "icount += 1" echo done
# Спасибо Stephane Chazelas за этот поучительный пример.
exit 0 (обратно)
51
Команда return -- это встроенная команда Bash. (обратно)52
Herbert Mayer определяет рекурсию, как "...описание алгоритма с помощью более простой версии того же самого алгоритма..." Рекурсивной называется функция, которая вызывает самого себя. (обратно)53
Слишком глубокая рекурсия может вызвать крах сценария. #!/bin/bashrecursive_function () { (( $1 < $2 )) && recursive_function $(( $1 + 1 )) $2; # Увеличивать 1-й параметр до тех пор, #+ пока он не станет равным, или не превысит, второму параметру. }
recursive_function 1 50000 # Глубина рекурсии = 50,000! # Само собой -- Segmentation fault.
# Рекурсия такой глубины может "обрушить" даже программу, написанную на C, #+ по исчерпании памяти, выделенной под сегмент стека.
# Спасибо S.C.
exit 0 # Этот сценарий завершает работу не здесь, а в результате ошибки Segmentation fault. (обратно)