Дата создания: 16.12.97
Источники:
- bash man page
- /gnu/docs/bash1147/document/featu_*.htm (bash features overview)
- /gnudocs/sh-util1.12/doc/sh_ut?.htm (sh-utils documentation)
- news://comp.unix.shell/faq.shell? (shells FAQ)
- news://comp.unix.shell/bash.faq (bash FAQ)
- csh.whynot ( Tom Christiansen . Cch Programming Considered Harmful)
ЗАМЕЧАНИЯ ОБ ЭТОМ ДОКУМЕНТЕ
В помощь читающим цветную версию
(в данный момент форматирование документа не завершено; скоро все будет выглядеть чуть более прилично;
)
Примеры, в которых метаобозначения типа [[команда 1]] или [[аргументы]] нужно заменить конкретными названиями, набраны
темно-синим цветом.
Примеры отдельных команд или скриптов, готовых к выполнению as is, набраны
коричневым цветом.
Если при выполнении скриптов на экран выводятся какие-то результаты, то эти результаты набраны
бирюзовым цветом.
другие особенности
Мне не удалось подобрать адекватных терминов (однословных) для перевода слов [[expansion]] и [[shell]], и далее по тексту для избежания [[несклоняемости]] вместо английских слов используются слова [[экспансия]] и [[шелл]] (то же самое можно сказать о [[баше]]). Если вы борец за чистоту русского языка, можете смотреть на фразы типа [[система сообщает шеллу]] как на [[система сообщает shell'у]], но лично мне использование русских падежных окончаний после слов, записанных латинскими буквами, нравится еще меньше, чем введение варварских неологизмов.
Если у вас есть какие-то идеи, напишите, пожалуйста, по адресу grg@philol.msu.ru
ЕЩЕ НЕ ОПИСАНЫ:
BASH И ЕГО МЕСТО СРЕДИ ДРУГИХ SHELLS
BOURNE_SHELL=sh, {ba,k,z}sh
C_SHELL={c,tc}sh
OTHER_SHELL=rc ssh
Различия между bash и sh (а также особенности новейшей версии bash) описаны в конце документа.
ЗАПУСК BASH И ВЫХОД ИЗ НЕГО. КОНФИГУРАЦИОННЫЕ ФАЙЛЫ
Чтобы запустить какой-то скрипт на исполнение, пишут
bash filename
Если нужно выполнить встроенную команду, надо писать
bash -c 'command'
При запуске login-shell
Для всех пользователей: если есть файл /etc/profile , выполнить его.
Для данного пользователя: выполнить первый из существующих файлов: ~/.bash_profile, ~/.bash_login или ~/.profile (~ — директория пользователя)
При выходе из login-shell
Выполняется ~/.bash_logout , если есть.
При запуске non-login shell:
Интерактивный — выполнить ~/.bashrc.
Неинтерактивный — исполнить файлы с именами $BASH_ENV и $ENV
УСТРОЙСТВО КОМАНДНОЙ СТРОКИ
Под «командой» далее будет пониматься или отдельная команда, например:
ls
— или так называемый конвеер (pipeline) — последовательность двух или более команд, в которой станартный вывод предшествующей команды передаются на стандартный ввод последующей:
ls | more
В bash синтаксис pipeline несколько расширен по сравнению с sh, и имеет следующий вид:
[time [-p] ] [ ! ] command [ | command2 ... ]
— где в факультативную часть входит «time» — зарезервированное слово, используемое для измерения времени, затраченного на выполнение команды, а также «!» — знак отрицания, меняющий код завершения команды на противоположный.
Обычно pipeline находится на одной строке. Если требуется разместить ее на нескольких строках, несколько строк можно объединять в одну логическую строку, используя знак переноса «\». На одной строке можно записывать несколько команд, разделяя их специальными знаками (см. ниже).
Командная строка может состоять из одной или нескольких команд (точнее, pipelines). Для группирования команд применяются следующие символы:
символы «;» и «&» — выполнение нескольких команд
Выполнить обе команды:
команда1; команда2 # последовательное выполнение
команда1& команда2 # параллельное выполнение
Символ «;» используется для последовательного выполнения нескольких команд: после завершения одной команды начинается выполение другой. Если вместо «;» используется «&», то команда, сопровождаемая этим знаком, выполняется в фоновом режиме, а выполнение следующей команды начинается немедленно, и, таким образом, две или более команд выполняются параллельно.
Note that wherever you see a `;’ in the description of a command’s syntax, it may be replaced indiscriminately with one or more newlines.
Символы «&&» и «||» — условное выполнение команд
Выполнить команду1, и если она выполнилась удачно, выполнить команду2:
команда1 && команда2
Выполнить команду1, и если она выполнилась неудачно, выполнить команду2:
команда1 || команда2
Как известно, каждая команда возвращает некоторый код завершения, по которому можно судить об «успешности» выполнения. Если на командную строку смотреть как на логическое выражение, значение которого требуется вычислить, где отдельные команды — переменные, принимающие значение «истина» или «ложь», то знаки «&&» и «||» можно рассматривать как операции логического И и ИЛИ. Отсюда понятна и логика действия этих связок в командой строке: если первая из двух команд, соединенных связкой И, возвращает «ложь», то результат всего выражения — заведомо «ложь», поэтому вторая команда не выполняется; аналогично, если первая из двух команд, соединенных связкой ИЛИ, первая выполнилась успешно, то уже известно, что результат всего выражения — «истина», и вторая команда не выполняется.
В отличие от подобных операций в Си, связки «||» и «&&» в bash имеют одинаковый приоритет, то есть выражение «A || B && C» аналогично «(A || B) && C», но не «A || (B && C)». Для изменения приоритета (порядка выполнения) можно использовать круглые или фигурные скобки (см. ниже)
символы {} — группирование команд в один pipeline
Чтобы сделать перенаправление ввода-вывода для нескольких команд, вместо
"cmd1 >a; cmd2 >>a"
— можно писать
"{ cmd1 ; cmd2; } >a"
символы ( )
( ) — команды, после выполнения которых сделанные ими изменения environment vars восстанавливаются
Напр. строка:
a="global"; (a="local"; echo now a is $a); echo and now $a
выведет:
now a is local
and now global
И фигурные, и круглые скобки можно использовать для группирования команд с целью изменения порядка выполнения команд со связками «||» и «&&».
Проверка значения арифметического выражения с помощью (( ))
Выражение, заключенное в двойные круглые скобки, будет вычислено по правилам вычисления арифметических выражений, действующих, кроме данного случая, еще и для конструкции $(()) и команды let. После вычисления выражения команда считается выполненной успешно (и возвращается код 0) в том случае, если результат отличен от нуля, и неуспешно в случае равенства результата нулю.
символ !
! команда
— отрицание: ставится перед командой для отрицания кода ее выхода
ЭКСПАНСИЯ
Экспансия — процесс анализа командной строки с целью нахождения в ней специальных обозначений (выражений) и подстановки на их место соответствующих значений.
Если надо посмотреть результат экспансии набранной в данный момент строки, можно нажать M-C-e (Esc, Ctrl-e) , а затем можно вернуть на место прежнюю строку через undo (Ctrl-»-»).
Порядок экспансии таков:
1. {}-экспансия (bash specific)
Создает преамбулы и постамбулы :
{prefix1,prefix2,…}radix{suffix1,suffix2,…}
Напр. создать структуру директорий:
mkdir /usr/{bin,lib,libexec,local,share{,/man,/doc,/misc,/locale},X11R6{,/bin,/lib,/man,/share}}
создаст:
/usr/lib
/usr/libexec
/usr/local
/usr/share
/usr/share
/usr/share/man
/usr/share/doc
/usr/share/misc
/usr/share/locale
/usr/X11R6
/usr/X11R6/bin
/usr/X11R6/lib
/usr/X11R6/man
/usr/X11R6/share
2. ~-экспансия
~/ — директория текущего пользователя
~user1/ — директория пользователя user1
~+ — $PWD
~- — $OLDPWD
3. $-экспансия
${n} — Если цифр больше одной, номер параметра надо брать в {}
${n:-default} — если параметр или переменная пусты, подставить default
${var:=default} — только для переменных: если переменная пуста, присвоить ей default и подставить это значение
${n:?message} — если пусто, выдать сообщение message и прекратить работу
$# — количество аргументов, в отличие от Си $0 не считается
${#n} — длина параметра или переменной
${n#pattern} отрезать начало, совпадающее с паттерн (shortest matching)
${n##pattern} отрезать начало, совпадающее с паттерн (longest matching)
${n%pattern} отрезать конец, совпадающий с паттерн (shortest matching)
${n%%pattern} отрезать конец, совпадающий с паттерн (longest matching)
set $1="--file=a.txt"
echo ${1#--file=}
a.txt
Если надо при передаче всех аргументов сохранить исходные кавычки, используется "$@" (именно в двойных кавычках!). А "$*" передают все аргументы как один, тоже в кавычках. Без кавычек $* $@ эквивалентны и не годятся для передачи аргументов в кавычках.
$? — код выхода последней команды, в т. ч. встроенной (cp. DOS errorlevel)
$$ — PID, очень полезно для создания временных файлов с уникальными именами:
tmpfile1=tmp1$$
tmpfile2=tmp2$$
Expands to the process ID of the most recently executed background (asynchronous) command.
$_ Последний аргумент предыдущей команды.
4. командная подстановка
$( ) и ` ` (обратные кавычки). Заменяются на вывод команды без символов новой строки
— старый стиль, обрабатываются внутренние backslashes . чтобы сделать вложение, внутри надо писать:
$(command1 $(command2))
5. арифметическая подстановка
Есть, среди прочих, операции << и >>
Переменные можно использовать как с » $» , так и без.
= *= /= %= += -= <<= >>= &= ^= |=
n # — префикс, указывающий любую [позиционную] систему счисления
6. подстановка процесса (bash specific)
Возможна на системах, поддерживающих named pipelines(FIFOs)
>(команды)
— отправить вывод команды в некоторый файл и передать имя этого файла как аргумент другой команде.
<(команды)
— отправить вывод команд в файл и подставить имя этого файла
Пример. Сравнить выводы программ newprogram и oldprogram:
diff <(newprogram) <(oldprogram)
Еще пример. Загрузить вывод команды ls в редактор vi:
vi <(ls)
Следует заметить, что выполнение именно этой команды соответствует ожиданиям, тогда как команда:
ls | vi
— приведет или к сообщению об ошибке, или к другим неожиданным последствиям.
7. разбиение на слова
Обрабатывает ?, *, [ list ] и [^ list ] в именах файлов
* — все файлы, кроме начинающихся на «.»
.* — файлы, начинающиеся на «.»
.[^.]* .??* *
- «.[^.]*» включает все файлы с одной точкой в начале (но не с двумя), в именах которых на втором месте не стоит «.»
- «.??» включает все файлы, состоящие из точки и еще двух знаков, что позволит исключить файл «..»
- «*» включает все файлы, не начинающиеся с «.»
9. удаление кавычек
В конце экспансии все кавычки, кроме экранированных ( \») удаляются
Кавычки и экранирование специальных символов
Метасимволы и их экранирование
| | | & | ; | ( ) | < > | пробел | табулятор |
Двойные и одинарные кавычки.
Другие виды кавычек
$'escape-sequence'
echo Backspaces inserted in this string will remove a whole$'\b\b\b\b\b' word
ПЕРЕНАПРАВЛЕНИЕ
При нескольких перенаправлениях существенен порядок:
command 2>&1 1>a.txt
перенаправит sdderr на stdout , а stdout на a.txt, а вот
command 1>a.txt 2>&1
перенаправление «здесь документы»
Пример из news://comp.unix.shell:
#!/bin/bash
ftp -n << EOF
open somehost.somedomain
user Anonymous aaa@bbb.com
cd /pub/upload
put /home/me/myfile.txt
quit
EOF
user USER_NAME PASSWORD
динамическое перенаправление
#!/bin/bash
echo
Эта строка выводится на экран
exec >file.txt
echo
А эта строка в файл
echo И эта в файл
— выведет на экран только одну строку, а две других запишет в file.txt
дескрипторы
открытие новых дескрипторов
#!/bin/bash
#создать файл-пример для последующего чтения
cat << EOF >os.txt
ОПЕРАЦИОННЫЕ СИСТЕМЫ
UNIX
DOS
OS/2
Windows NT
EOF
echo Открываем дескрипторы 3 и 4
exec 3>docname.txt
exec 4<os.txt
echo Читаем одну строку через дескриптор 4
read d <&4
echo Записываем строку через дескриптор 3
echo $d >&3
— запишет в файл docname.txt строку [[ОПЕРАЦИОННЫЕ СИСТЕМЫ]].
восстановление перенаправленных дескрипторов
#!/bin/bash
echo Эта строка выводится на экран
# запомнить дескриптор 1 в дескрипторе 3, а 1 перенапавить в file.txt:
exec 3>&1 1>file.txt
echo А эта строка в файл
echo И эта в файл
# восстановить предыдущее значение дескриптора 1:
exec 1>&3
echo Эта строка опять на экран
Эта строка выводится на экран
Эта строка опять на экран
— а две другие строки запишет в файл file.txt
Известно, как передать через pipe и stdout, и stderr:
command1 2>&1 | command2
command1 3>&1 2>&1 1>&3 | command2
Вот пример из [[ csh.whynot]] , иллюстрирующий этот прием:
grep yyy xxx 3>&1 2>&1 1>&3 3>&- | sed
s/file/foobar/
grep: xxx: No such foobar or directory (ENOENT)
закрытие дескриптора
Закрытие дескриптора осуществляется дублированием его псевдодескриптором » &-»:
#!/bin/bash
exec 1>&-
echo
Этот текст никто не увидит
КОМАНДЫ ИЗ НАБОРА SHELL-UTILS
Подробное описание команд из этого набора см. в документации к GNU SHELL-UTILS.
команды echo, pwd, test
Проверить, дублируется ли некоторая внутренняя команда внешней, можно с помощью » type -a команда».
let
[ ], test & /usr/bin/test
Проверяет истинность условия (тестирует условие).
Можно комбинировать и отрицать условия:
[ условие1 - a условие2 ] Логическое И
[ условие1 - o условие2 ] Логическое ИЛИ
-t [ fd ] истина, если file descriptor fd (по умолчанию 0) не перенаправлен
Напр. ‘! — t 0 ‘ — осуществляется ли ввод с клавиатуры
-e file Истина, если существует
-s file Истина, если имеет ненулевой размер
dir=${1:-.} # for a standalone script
set -- $dir/.??* $dir/.[!.] $dir/*
case $#$* in
"3$dir/.??* $dir/.[!.] $dir/*")
echo empty ;;
*)
echo not empty ;;
esac
-f file Обычный файл (не директория)
file1 -ot file2 Старее (older than)
file1 -nt file2 Новее (newer than)
(not equal, less than, less or equal, greater than etc.)
expr (внешняя команда)
match string regexp или string : regexp
expr $i + 1 == $n && break
let i+1==n && break
[ $[$i+1] = "$n" ] && break
tee
Название английской буквы » T». T-shaped pipe splitter.
Перенаправляет вывод стразу во много мест (файлов)
Ключ » -a» заставляет дополнять существующие файлы, а не затирать.
date
Формат вывода даты задается например так
date +%d.%m.%y
Ключ -v (-d в GNU date) позволяет напечатать не сегодняшнюю дату, а, например, завтрашнюю:
date -v +1d # /bin/date
date -d "+1 day" # то же для GNU date
date -v -1m # /bin/date
date -d "-1 month" # GNU date
cp `date +news%d%m%y.txt` newstoday.txt
Работа с именами файлов: basename, dirname, pathchk
dirname — пусть к файлу без самого имени файла
pathchk — проверить, допустимо ли имя файла или пути в данной системе
basename()
{
local name="${1##*/}"
echo "${name%$2}"
}
dirname()
{
local dir="${1%${1##*/}}"
[ "${dir:=./}" != "/" ] && dir="${dir%?}"
echo "$dir"
}
fullpath=${1:-/dir/file.ext}
name=`basename "$fullpath"`
dir=`dirname "$fullpath"`
echo "file '$name' is located in $dir"
file 'file.ext' is located in /dir
function ext
{
local name=${1##*/}
local name0="${name%.*}"
local ext=${name0:+${name#$name0}}
echo "${ext:-.}"
}
function namename
{
local name=${1##*/}
local name0="${name%.*}"
echo "${name0:-$name}"
}
Другие внешние команды
tty — чем является стандартный ввод (tty / not tty)
sleep — заснуть на столько-то секунд
nohup — запуск программы, продолжающей работать после logoff
-
- зарезервированное слово time для вычисления времени выполнения программы
- одномерные массивы
- новые виды экспансии: ${param:length:offset}, ${param/pat/replace-to}
- новые команды disown и shopt
- новые виды кавычек для locale-specific translations, обозначения $’…’ и $»…».
- ссылки на переменные: {$! param_name } будет вычислена переменная с именем, хранящимся в $ param_name (в старом для этого нужен eval)
- новые возможности BASH 2.0 (см. выше)
- long named options (для вызова bash)
- отрицание !
- слово function (по слухам, в некоторых реализациях sh это слово есть)
- команда select
- обращение к параметрам больше девятого ${10}
- длина параметра ${#param}, «редактирование» ${var#str}, ${var%str}
- нет переменных: BASH, BASH_VERSION, BASH_VERSINFO, UID, EUID, REPLY , TIMEFORMAT, PPID, PWD , OLDPWD, SHLVL, RANDOM , SECONDS, LINENO, HISTCMD, HOSTTYPE , OSTYPE , MACHTYPE, HOSTNAME , ENV , PS3 , PS4 , DIRSTACK, PIPESTATUS, HISTSIZE, HISTFILE, HISTFILESIZE, HISTCONTROL, HISTIGNORE, GLOBIGNORE, PROMPT_COMMAND, FCEDIT, FIGNORE, IGNOREEOF, INPUTRC, SHELLOPTS, OPTERR , HOSTFILE, TMOUT, histchars, auto_resume
- перенаправление <>, &>, >|
- echo -e (в некоторых реализациях имеется), hash -p (то же), type -apt,
- test -o optname/s1 == s2/s1 < s2/s1 > s2/-nt/-ot/-ef/-O/-G/-S
- разные конфигурационные файлы для интерактивного или неинтерактивного сеанса: ~/. bashrc и $ENV соотв .
- функции и переменные с одинаковыми именами
- { }- экспансия: {префиксы}корень{суффиксы}
- обозначение ~ (имеется в некоторых реализациях)
- let (в некоторых реализациях есть команда с таким же именем, но отличающимся поведением)
- $((expr)) — только $[] или вообще нет ?
- вместо $(…) только `…`
- подстановки процессов >(cmd) <(cmd)
- alias и unalias (имеются в некоторых реализациях)
- local (в некоторых реализациях есть команда с таким же именем, но отличающимся поведением)
- история команд (в некоторых реализациях)
- команды command, builtin, declare, typeset, dirs, enable, help, logout, popd, pushd
- экспортируемые функции
- filename generation when using output redirection (command >a*)
Информация о пользователях:
id, logname, whoami, groups, users, who
Информация о системе:
ENVIRONMENT И АТРИБУТЫ БАША
export
Команда export и используется добавления переменных к environment.
Экспортировать можно как переменные, так и функции (-f).
В принципе, команда export не нужна, так как вместо нее можно использовать declare -x.
export -n var
declare, typeset
-a -- массивы -f -- функции -i -- целые числа -r -- только для чтения -x -- экспортируемые
declare -irx MAGIC_NUMBER=666
Экспортировать и делать только для чтения можно не только переменные, но и функции (-f).
Опция опция -p показывает атрибуты переменной или всех переменных, если переменная не указана.
declare -r
declare -ri EUID="42"
declare -ri PPID="1"
declare -ri UID="42"
— однако просто declare выведет переменные без указания их признаков. Зато:
export -p
работает так, как можно было бы ожидать от declare -p
readonly
unset
Отменяет определение переменной или функции (-f).
set
set -o
allexport on
braceexpand on
emacs on
errexit off
histexpand on
ignoreeof off
interactive-comments on
monitor off
noclobber off
noexec off
noglob off
nohash off
nounset off
physical off
posix off
privileged off
verbose off
vi off
xtrace off
vi (нет короткого названия) — возможности редактирования, аналогичные командам vi
a (allexport) — автоматический экспорт всех переменных
f (noglob) — запрещает обрабатывать маски (*, ? и т. д.).
h (hashall) — запоминать пути к выполненным командам (по умолчанию)
n (noexec) — не выполнять команды, только проверить их правильность
v (verbose) — аналог echo on в ДОС
x (xtrace) — расширенный аналог verbose
n (nounset) — рассматривать использование неопределенной переменной как ошибку
C (noclobber) — см. про переменную noclobber
«—» — если за этим ничего не следует, unset позиционные параметры.
ВСТРОЕННЫЕ КОМАНДЫ (SHELL BUILTINS)
команда «:» (двоеточие)
Осуществляет анализ командной строки, но не выполняет ее. Всегда завершается успешно.
#!/bin/bash
: $[a=2*2]
echo "a=$a"
a=4
source или «.» (точка)
enable
Запрещает (-n) или снова разрешает применение встроенной команды.
Когда запрещается, то вместо встроенной команды ищется файл, если его нет — ошибка
exec
PerlProgram $scriptname && exec perl $scriptname
Таким образом достигается [[динамическое]] перенаправление.
echo Эта строка выводится на экран
exec >file.txt
echo А эта строка в файл
echo И эта в файл
Более того, можно открывать для ввода или вывода новые дескрипторы:
# создать файл-пример для последующего чтения
cat << EOF >user.rsp
29.06.77
30.01.85
EOF
exec 3>file.log
exec 4<user.rsp
echo Вводим дату через дескриптор 4
read d <&4
echo Дата получена и будет записана через дескриптор 3
echo $d >&3
getopts
getopts названия-опций переменная [ альтернативные-аргументы ]
Понимает «—» и дальше опции не смотрит Ни фига не понимает длинные . опции (—опция) .
! Если есть альтернативные аргументы, то анализируют их, а не $1-$n
Если опция имеет аргумент, он помещается в OPTARG.
shift $[$OPTIND-1]
while getopts "qhe:v" arg
do
echo "Opt: $arg ${OPTARG:+($OPTARG)}"
case $arg in
q) quiet=1;; # установить quiet mode
h) echo Using: $0 [-q] [-h] [-e scriptfile] FILES...;
exit;;
e) scriptfile=OPTARG;; # задать файл с программой
esac
done
shift $[$OPTIND-1]
while [ -n "$1" ]
do
echo Processing file $1...
# разные действия...
shift
done
hash
pushd, popd, dirs
dirs выводит стек запомненных директорий
type
можно только тип ( -t): file, builtin, alias, keyword
ulimit
Показывает или устанавливает ограничения на что-либо. Можно показать все ограничения (-a)
umask
alias, unalias
ИСТОРИЯ КОМАНД И КОМАНДЫ ИСТОРИИ
history
Показывает всю историю, или последние n команд.
символ !
!строка — одна из последних команд, начинающаяся строкой
!?строка — -»- содержащая строку
^строка1^строка2 — последняя команда, в которой строка1 заменена на строку2
команды fc и многие другие, пока лень разбираться.
ПЕРЕМЕННЫЕ
PS1, PS2, PS3, PS4, PROMPT_COMMAND
Если пусто ([ -z "$PS1" ]) , шелл не интерактивный.
[ -n "$PS1" ] && echo interactive || echo batch job
PS2 «>» — запрос продолжения ввода
PS4 «+» — команда, выполненная в режиме трассировки (set -x)
PROMPT_COMMAND — команда, выполняемая всякий раз перед показом PS1
Есть динамически вычисляемые escape-последовательности:
\w — текущий каталог (полный путь)
\W — текущий подкаталог, без пути к нему
\$ — «$» для обычного пользователя и «#» для root
Другие
SECONDS — сколько секунд запущен баш
LINENO — номер строки в текущем скрипт-файле или функции
HOSTTYPE — тип машины, напр.: «PCAT» (IBM PC AT), «i586″
OSTYPE — тип операционной системы, напр.: «MSDOS», «linux», «freebsd2.2.5″
MAIL — файл, в который приходит почта, если не задано, что-нибудь вроде
/var/mail/user
MAILCHECK — через сколько секунд проверять почту, по умолчанию 60
OPTARG, OPTIND, OPTERR
Результаты последнего getopts (см.)
булевые
nolinks — если установлена, превращать symlinks в настоящие файлы
выдавать ошибку при попытке перенаправить («>») в существующий файл, но можно использовать «>|»
ОПЕРАТОРЫ
другие
until test-commands; do consequent-commands; done
while test-commands; do consequent-commands; done
if
if test-commands; then
consequent-commands;
[elif more-test-commands; then
more-consequents;]
[else alternate-consequents;]
fi
Вместо if можно также использовать символы группирования команд » &&» и » ||»:
[ -e config.txt ] && echo configuring... || echo no config
for
for name [in words ...]; do commands; done
Склеить текстовые файлы в один, указав для каждого файла его название:
echo "{directory $PWD}" > texts.lst
for fn in *.txt
do
echo "{file $fn}" >> texts.lst
cat $fn >> texts.lst
done
Если «in …» не указано, проходит по всем параметрам (т. е. in »$@»)
for fn # список не указан, подразумевается "$@"
do
echo Processing file $fn...
# разные действия...
done
select, read
select a in strings;
do if [ -n "$a" ] # строка непуста только при допустимом выборе
then echo $a eto klass
break
else
echo $REPLY eto ne otvet # то что было введено сохраняется в $REPLY
fi;
done
read без аргументов тоже запоминает строку в REPLY
case
case слово in [значение [| значение]...) команды;;]... esac
значение может содержать ? и *
for name in a.gz b.tar c.zip d.txt /kernel
do
echo -n "$name: "
case $name in
/kernel) echo "Ядро";;
*.txt) echo "Текстовый файл";;
*.gz|*.tar|*.zip) echo "Архив";;
*.c) echo "Программа на Си";;
*.cc|*.C|*.cpp|*.cx) echo "Программа на C++";;
*) echo "А это еще что?";;
esac
done
ФУНКЦИИ
function, return
function Warning()
{
echo "Warning: $1"
echo "continue(y/n)?"
read answer
if [ o"$answer" != o"y" ]; then
return 1 # 1 Значит "ошибка, ложь"!!!
else
return 0 # 0 -- Удачное завершение, истина!!!
fi
}
if Warning "the string is empty!"; then
echo OK;
else
echo Operation aborted
fi
local
объявляет локальные переменные внутри функций, и может сразу задать им значение
local a
local b=kuku
ИОО: Иногда отвечаемые ответы
shells FAQ
Источник: faq.shell из comp.unix.shell
1.2 Что значит «{некоторое странное название команды}»
awk = «Aho, Weinberger and Kernighan»
grep = «Global Regular Expression Print» (аналог команды ed «g/re/p»)
fgrep = «Fixed GREP»; fgrep searches for fixed strings only.
Perl = «Pathologically Eclectic Rubbish Lister»
Unics (Unix) = «UNiplexed Information and Computing System»
gecos = «General Electric Comprehensive Operating Supervisor»
rc (напр. «.bashrc» или «/etc/rc») = «RunCom»
2.5 Как считать со стандартного ввода один символ
stty -icanon
echo -n "Enter a character: "
readchar=`dd if=/dev/tty bs=1 count=1 2>/dev/null`
echo "Thank you for typing a $readchar ."
stty icanon
Про dd см. в документации к SHELL-UTILS
2.6 Как переименовать все файлы *.html в *.htm
find -name '*.html' | while read a; do mv $a ${a%.html}.htm; done
2.12 Как обратиться к параметру номер i , если i не константа, а переменная?
eval "param=\${$i}"
echo "Parameter number $i is $param"
А вот программа, которая выводит все свои параметры в обратном порядке, (C) 1997 ГС:
i=$#
while let i
do
eval "echo \${$i}"
i=$[i-1]
done
BASH FAQ
Источник: bash.faq из comp.unix.shell
Последняя версия BASH
Новые возможности по сравнению с 1.14.7:
Чем BASH отличается от SH
В SH отсутствуют следующие возможности BASH:
16.12.1997-23.09.1998, Григорий Строкин (grg@philol.msu.ru)
Ситуация вот какая. Меня недавно попросили поработать модератором на форуме. И, чёрт возьми, мне это понравилось:)
А вот недавно я увидел ваш форум и прикинул: А почему бы и здесь не попроситься в модеры. Вопрос: можно ли у вас стать модератором, и если да, то как?