Настройки шрифта

| |

Фон

| | | |

 



$BASH_VERSINFO[n]

это массив, состоящий из 6 элементов, и содержащий информацию о версии Bash. Очень похожа на переменную $BASH_VERSION, описываемую ниже.

# Информация о версии Bash:



for n in 0 1 2 3 4 5

do

echo \"BASH_VERSINFO[$n] = ${BASH_VERSINFO[$n]}\"

done



# BASH_VERSINFO[0] = 2 # Major version no.

# BASH_VERSINFO[1] = 05 # Minor version no.

# BASH_VERSINFO[2] = 8 # Patch level.

# BASH_VERSINFO[3] = 1 # Build version.

# BASH_VERSINFO[4] = release # Release status.

# BASH_VERSINFO[5] = i386-redhat-linux-gnu # Architecture

# (same as $MACHTYPE).



$BASH_VERSION

версия Bash, установленного в системе

bash$ echo $BASH_VERSION

2.04.12(1)-release





tcsh% echo $BASH_VERSION

BASH_VERSION: Undefined variable.





Проверка переменной $BASH_VERSION -- неплохой метод проверки типа командной оболочки, под которой исполняется скрипт. Переменная $SHELL не всегда дает правильный ответ.

$DIRSTACK

содержимое вершины стека каталогов (который управляется командами pushd и popd)

Эта переменная соответствует команде dirs, за исключением того, что dirs показывает полное содержимое всего стека каталогов.

$EDITOR

заданный по-умолчанию редактор, вызываемый скриптом, обычно vi или emacs.

$EUID

\"эффективный\" идентификационный номер пользователя (Effective User ID)

Идентификационный номер пользователя, права которого были получены, возможно с помощью команды su.

Значение переменной $EUID необязательно должно совпадать с содержимым переменной $UID.

$FUNCNAME

имя текущей функции

xyz23 ()

{

echo \"Исполняется функция $FUNCNAME.\" # Исполняется функция xyz23.

}



xyz23



echo \"FUNCNAME = $FUNCNAME\" # FUNCNAME =

# Пустое (Null) значение за пределеми функций.



$GLOBIGNORE

Перечень шаблонных символов, которые будут проигнорированы при выполнении подстановки имен файлов (globbing) .

$GROUPS

группы, к которым принадлежит текущий пользователь

Это список групп (массив) идентификационных номеров групп для текущего пользователя, как эо записано в /etc/passwd.

root# echo $GROUPS

0



root# echo ${GROUPS[1]}

1



root# echo ${GROUPS[5]}

6





$HOME

домашний каталог пользователя, как правило это /home/username (см. Пример 9-13)

$HOSTNAME

Сетевое имя хоста устанавливается командой hostname во время исполнения инициализирующих сценариев на загрузке системы. Внутренняя переменная $HOSTNAME Bash получает свое значение посредством вызова функции gethostname(). См. так же Пример 9-13.

$HOSTTYPE

тип машины

Подобно $MACHTYPE, идентифицирует аппаратную архитектуру.

bash$ echo $HOSTTYPE

i686

$IFS

разделитель полей во вводимой строке (IFS -- Input Field Separator)

По-умолчанию -- пробельный символ (пробел, табуляция и перевод строки), но может быть изменен, например, для разбора строк, в которых отдельные поля разделены запятыми. Обратите внимание: при составлении содержимого переменной $*, Bash использует первый символ из $IFS для разделения аргументов. См. Пример 5-1.

bash$ echo $IFS | cat -vte

$



bash$ bash -c \'set w x y z; IFS=\":-;\"; echo \"$*\"\'

w:x:y:z





При всем при том следует помнить, что при использовании $IFS пробельные символы обрабатываются несколько иначе, чем все остальные.

Пример 9-1. $IFS и пробельные символы

#!/bin/bash

# При использовании $IFS, пробельные символы обрабатываются иначе, чем все остальные.



output_args_one_per_line()

{

for arg

do echo \"[$arg]\"

done

}



echo; echo \"IFS=\\\" \\\"\"

echo \"-------\"



IFS=\" \"

var=\" a b c \"

output_args_one_per_line $var # output_args_one_per_line `echo \" a b c \"`

#

# [a]

# [b]

# [c]



echo; echo \"IFS=:\"

echo \"-----\"



IFS=:

var=\":a::b:c:::\" # То же самое, только пробелы зменены символом \":\".

output_args_one_per_line $var

#

# []

# [a]

# []

# [b]

# [c]

# []

# []

# []



# То же самое происходит и с разделителем полей \"FS\" в awk.



# Спасибо Stephane Chazelas.



echo



exit 0



(Спасибо S. C., за разъяснения и примеры.)

$LC_COLLATE

Чаще всего устанавливается в .bashrc или /etc/profile, эта переменная задает порядок сортировки символов, в операциях подстановки имен файлов и в поиске по шаблону. При неверной настройке переменной LC_COLLATE можно получить весьма неожиданные результаты.

Начиная с версии 2.05, Bash, в операциях подстановки имен файлов, не делает различий между символами верхнего и нижнего регистров, в диапазонах символов в квадратных скобках. Например,, ls [A-M]* выведет как File1.txt, так и file1.txt. Возврат к общепринятому стандарту поведения шаблонов в квадратных скобках выполняется установкой переменной LC_COLLATE в значение C командой export LC_COLLATE=C в файле /etc/profile и/или ~/.bashrc.

$LC_CTYPE

Эта внутренняя переменная определяет кодировку символов. Используется в операциях подстановки и поиске по шаблону.

$LINENO

Номер строки исполняемого сценария. Эта переменная имеет смысл только внутри исполняемого сценария и чаще всего применяется в отладочных целях.

# *** BEGIN DEBUG BLOCK ***

last_cmd_arg=$_ # Запомнить.



echo \"Строка $LINENO: переменная \\\"v1\\\" = $v1\"

echo \"Последний аргумент командной строки = $last_cmd_arg\"

# *** END DEBUG BLOCK ***



$MACHTYPE

аппаратная архитектура

Идентификатор аппаратной архитектуры.

bash$ echo $MACHTYPE

i686

$OLDPWD

прежний рабочий каталог (\"OLD-Print-Working-Directory\")

$OSTYPE

тип операционной системы

bash$ echo $OSTYPE

linux

$PATH

путь поиска, как правило включает в себя каталоги /usr/bin/, /usr/X11R6/bin/, /usr/local/bin, и т.д.

Когда командный интерпретатор получает команду, то он автоматически пытается отыскать соответствующий исполняемый файл в указанном списке каталогов (в переменной $PATH). Каталоги, в указанном списке, должны отделяться друг от друга двоеточиями. Обычно, переменная $PATH инициализируется в /etc/profile и/или в ~/.bashrc (см. Глава 26).

bash$ echo $PATH

/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin:/sbin:/usr/sbin



Инструкция PATH=${PATH}:/opt/bin добавляет каталог /opt/bin в конец текущего пути поиска. Иногда может оказаться целесообразным, внутри сценария, временно добавить какой-либо каталог к пути поиска. По завершении работы скрипта, эти изменения будут утеряны (вспомните о том, что невозможно изменить переменные окружения вызывающего процесса).

Текущий \"рабочий каталог\", ./, обычно не включается в $PATH из соображений безопасности.

$PIPESTATUS

Код возврата канала (конвейера). Интересно, что это не то же самое, что код возврата последней исполненной команды.

bash$ echo $PIPESTATUS

0



bash$ ls -al | bogus_command

bash: bogus_command: command not found

bash$ echo $PIPESTATUS

141



bash$ ls -al | bogus_command

bash: bogus_command: command not found

bash$ echo $?

127





Переменная $PIPESTATUS может давать неверные значения при вызове из командной строки.

tcsh% bash



bash$ who | grep nobody | sort

bash$ echo ${PIPESTATUS[*]}

0





Если поместить эти строки в сценарий и исполнить его, то будут выведены верные значения 0 1 0.

Спасибо Wayne Pollock за замечания и предоставленный пример.

$PPID

Переменная $PPID хранит PID (идентификатор) родительского процесса.[ 19 ]

Сравните с командой pidof.

$PS1

prompt, приглашение командной строки.

$PS2

Вторичное приглашение командной строки, выводится тогда, когда от пользователя ожидается дополнительный ввод. Отображается как \">\".

$PS3

Третичное приглашение (prompt), выводится тогда, когда пользователь должен сделать выбор в операторе select (см. Пример 10-29).

$PS4

Приглашение (prompt) четвертого уровня, выводится в начале каждой строки вывода тогда, когда сценарий вызывается с ключом -x. Отображается как \"+\".

$PWD

рабочий (текущий) каталог

Аналог встроенной команды pwd.

#!/bin/bash



E_WRONG_DIRECTORY=73



clear # Очистка экрана.



TargetDirectory=/home/bozo/projects/GreatAmericanNovel



cd $TargetDirectory

echo \"Удаление файлов в каталоге $TargetDirectory.\"



if [ \"$PWD\" != \"$TargetDirectory\" ]

then # Защита от случайного удаления файлов не в том каталоге.

echo \"Неверный каталог!\"

echo \"Переменная $PWD указывает на другой каталог!\"

exit $E_WRONG_DIRECTORY

fi



rm -rf *

rm .[A-Za-z0-9]* # удалить \"скрытые\" файлы (начинающиеся с \".\")

# rm -f .[^.]* ..?* удалить файлы, чьи имена начинаются с нескольких точек.

# (shopt -s dotglob; rm -f *) тоже работает верно.

# Спасибо S.C. за замечание.



# Имена файлов могут содержать любые символы из диапазона 0-255, за исключением \"/\".

# Оставляю вопрос удаления файлов с \"необычными\" символами для самостоятельного изучения.



# Здесь можно вставить дополнительные действия, по мере необходимости.



echo

echo \"Конец.\"

echo \"Файлы, из каталога $TargetDirectory, удалены.\"

echo



exit 0



$REPLY

переменная по-умолчанию, куда записывается ввод пользователя, выполненный с помощью команды read если явно не задана другая переменная. Так же может использоваться в операторе select, для построения меню выбора.

#!/bin/bash



echo

echo -n \"Ваше любимое растение? \"

read



echo \"Ваше любимое растение: $REPLY.\"

# REPLY хранит последнее значение, прочитанное командой \"read\" тогда, и только тогда

#+ когда команде \"read\" не передается имя переменной.



echo

echo -n \"Ваш любимый фрукт? \"

read fruit

echo \"Ваш любимый фрукт $fruit.\"

echo \"но...\"

echo \"Значение переменной \\$REPLY осталось равным $REPLY.\"

# Переменная $REPLY не была перезаписана потому, что

# следующей команде \"read\", в качестве аргумента была передана переменная $fruit



echo



exit 0



$SECONDS

Время работы сценария в секундах.

#!/bin/bash

# Автор: Mendel Cooper