- •Bash конспект
- •Замечания об этом документе
- •Запуск bash и выход из него. Конфигурационные файлы
- •Символы ";" и "&" -- выполнение нескольких команд
- •Символы "&&" и "||" -- условное выполнение команд
- •Символы ( )
- •Проверка значения арифметического выражения с помощью (( ))
- •Символ !
- •5. Арифметическая подстановка
- •6. Подстановка процесса (bash specific)
- •7. Разбиение на слова
- •8. Path-экспансия
- •9. Удаление кавычек
- •Кавычки и экранирование специальных символов Метасимволы и их экранирование
- •4. Командная подстановка
- •Двойные и одинарные кавычки. Другие виды кавычек
- •Перенаправление
- •Открытие новых дескрипторов
- •Восстановление перенаправленных дескрипторов
- •Закрытие дескриптора
- •Другие внешние команды
- •Информация о пользователях:
- •Информация о системе:
- •Символ !
- •1.2 Что значит "{некоторое странное название команды}"
- •2.5 Как считать со стандартного ввода один символ
- •2.6 Как переименовать все файлы *.Html в *.Htm
- •2.12 Как обратиться к параметру номер I , если I не константа, а переменная?
- •Последняя версия bash
- •Чем bash отличается от sh
Другие внешние команды
true
false
yes
printf
tty -- чем является стандартный ввод (tty / not tty)
sleep -- заснуть на столько-то секунд
nohup -- запуск программы, продолжающей работать после logoff
Информация о пользователях:
id, logname, whoami, groups, users, who
Информация о системе:
uname, hostname
ENVIRONMENT И АТРИБУТЫ БАША
Environment ≈ массив переменных, который наследуется вызываемыми башем программами. Это не все переменные, а только те, которые унаследовал сам баш, и те созданные в баше переменные, которым был присвоен признак "экспортируемых".
Атрибуты баша, или флаги, включают особые режимы функционирования баша. Устанавливаются командой set (см.).
export
Команда export и используется добавления переменных к environment.
Переменные, созданные в баше, не входят автоматически в environment (массив переменных, наследуемый запускаемыми программами). Однако это можно изменить с помощью команды set (см.).
Экспортировать можно как переменные, так и функции (-f).
В принципе, команда export не нужна, так как вместо нее можно использовать declare -x.
Чтобы изъять переменную из environment, нужно использовать
export -n var
declare, typeset
typeset -- устаревшее, но разрешенное название declare. Используйте это название, если хотите обеспечить с совместимоть с Korn shell.
Без аргументов выводит значения всех переменных. Если вызвана таким образом из скрипта, ведет себя довольно странно: сначала выводит текст скрипта, предшествующий команде set, затем все переменные, а затем ≈ текст скрипта, следующий за командой.
Если нет аргументов, но указаны опции, выводит определения переменных, имеющих такие опции, а именно:
-a -- массивы
-f -- функции
-i -- целые числа
-r -- только для чтения
-x --
экспортируемые
Если есть аргументы, то создаются переменные с указанными опциями или изменяются опции существующих. Если опция указана со знаком " +" вместо "-", она удаляется. Переменным попутно можно присвоить значения.
Пример:
declare -irx MAGIC_NUMBER=666
-- создает переменную MAGIC_NUMBER, которую нельзя изменять, которая всегда будет рассматриваться как целое число и которая автоматически добавляется к environment , как если бы была выполнена команда export. Кроме того, переменной присваивается значение.
Экспортировать и делать только для чтения можно не только переменные, но и функции (-f).
Внутри функций declare создает локальные переменные, аналогично local. В ksh (и в нек. реализациях sh?), не имеющем команды local, для создания локальных переменных можно использовать синоним declare typeset.
Опция опция -p показывает атрибуты переменной или всех переменных, если переменная не указана.
declare -r
выведет что-нибудь вроде:
declare -ri EUID="42"
declare -ri PPID="1"
declare -ri UID="42"
-- однако просто declare выведет переменные без указания их признаков. Зато:
export -p
работает так, как можно было бы ожидать от declare -p
readonly
Делает переменную или функцию (-f) read only или выводит список таких переменных (-p) . Аналогичную вещь делает 'declare -r', так что эта команда лишняя.
unset
Отменяет определение переменной или функции (-f).
set
Опции, переданные set , устанавливают атрибуты самого баша. Если вместо "-" перед атрибутом идет "+", атрибут сбрасывается. Если есть аргументы, set присваивает их позиционным параметрам $1, $2 и т. д.
Без опций и аргументов выводит все переменные. Если вызвана таким образом из скрипта, ведет себя довольно странно, как и команда declare (см.).
Атрибуты могут задаваться в короткой или длинной форме. В длинной форме ≈ через опцию -o. Опция -o без параметров выводит значения всех атрибутов:
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
Интересные атрибуты:
emacs (нет короткого названия) -- расширенные возможности редактирования. В интерактивных шеллах установлена по умолчанию.
vi (нет короткого названия) -- возможности редактирования, аналогичные командам vi
a (allexport) -- автоматический экспорт всех переменных
e (errexit) -- прекращать работу, если команда, не входящая в группу, или группа команд возвратила ненулевое значение. При прекращении работы не выдается никаких сообщений.
f (noglob) -- запрещает обрабатывать маски (*, ? и т. д.).
h (hashall) -- запоминать пути к выполненным командам (по умолчанию)
n (noexec) -- не выполнять команды, только проверить их правильность
v (verbose) -- аналог echo on в ДОС
x (xtrace) -- расширенный аналог verbose
n (nounset) -- рассматривать использование неопределенной переменной как ошибку
C (noclobber) -- см. про переменную noclobber
P (physical) -- при смене текущей директории на линк, делать именем текущей директории не имя линка, а имя физической директории.
"--" -- если за этим ничего не следует, unset позиционные параметры.
ВСТРОЕННЫЕ КОМАНДЫ (SHELL BUILTINS)
команда ":" (двоеточие)
Осуществляет анализ командной строки, но не выполняет ее. Всегда завершается успешно.
#!/bin/bash
: $[a=2*2]
echo "a=$a"
-- выведет:
a=4
Значение переменной $a было присвоено в результате [[побочного эффекта]] анализа, выполненного командой ":".
source или "." (точка)
Выполняет команды из указанного файла в текущем баше, без запуска нового, как если бы содержимое файла набиралось на клавиатуре. Это позволяет, в отличие от выполнения скрипта, запомнить изменения в environment, определения функций и прозвищ. Используя эту команду, в программу можно включать "библиотечные" функции, определенные в других файлах.
enable
Запрещает (-n) или снова разрешает применение встроенной команды.
Когда запрещается, то вместо встроенной команды ищется файл, если его нет -- ошибка
exec
Если имеется аргумент, заменяет текущий процесс (bash) на выполняемую команду, и к башу возврата уже не происходит:
PerlProgram $scriptname && exec perl $scriptname
Если аргумент не указан, но указаны символы перенаправления, exec устанавливает эти перенаправления, и выполнение текущего скрипта продолжается. Подробнее см. [[Перенаправление]]
Таким образом достигается [[динамическое]] перенаправление.
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 названия-опций переменная [ альтернативные-аргументы ]
Действует аналогично Си-функции getopt . Названия опций состоят из букв, соответствующих опциям. Если опция требует аргумент, после буквы ставится двоеточие.
Понимает "--" и дальше опции не смотрит Ни фига не понимает длинные . опции (--опция) .
! Если есть альтернативные аргументы, то анализируют их, а не $1-$n
Если опция имеет аргумент, он помещается в OPTARG.
OPTIND сначала равен 1, затем гетопт его увеличивает. Если надо запустить гетопт снова, надо снова присвоить единицу.
После первого неудачного гетопта ($? не равен 0) $OPTIND равен номеру первого аргумента, не являющегося опцией, если такой есть ($OPTIND <= $#). Чтобы обработать этот и последующие аргументы, нельзя писать ${$OPTIND}, поскольку номер параметра обязан быть константой. Вместо этого нужно сделать
shift $[$OPTIND-1]
и обращаться к $1 и т. д.
Если ошибочная опция, в переменной присваивается "?", и выдается сообщение об ошибке. Чтобы запретить вывод сообщений, надо или OPTERR=0 (по умолчанию 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
Показывает таблицу запомненных расположений команд. Можно стереть (-r), вопрос только в том, зачем то и другое.
pushd, popd, dirs
dirs выводит стек запомненных директорий
popd удаляет или последнюю запомненную, или такую-то по счету сверху стека (+0..n) или снизу (-0..n).
type
Похожа на команду which.
Информация о том, как проинтерпретировалась бы команда, будь она набрана в командной строке: Полное имя файла или сообщение типа 'shell builtin' или 'aliased to...'.
можно только тип ( -t): file, builtin, alias, keyword
Можно вывести все альтернативы ( -a ), например type -a ls" вернет "/bin/ls и ls is aliased to `gnuls --color=tty'"
ulimit
Показывает или устанавливает ограничения на что-либо. Можно показать все ограничения (-a)
umask
Атрибуты, с которыми создаются файлы данного пользователя. Без параметров показывает текущие в виде числа или букв (- S)
alias, unalias
создают и удаляют прозвища
ИСТОРИЯ КОМАНД И КОМАНДЫ ИСТОРИИ
history
Показывает всю историю, или последние n команд.
