Bash
Внутренние переменные
Поиск…
Вступление
Внутренние переменные Bash с первого взгляда
переменная | подробности |
---|---|
$* / $@ | Позиционные параметры функции / скрипта (аргументы). Развернитесь следующим образом: $* и $@ такие же, как $1 $2 ... (обратите внимание, что вообще не имеет смысла оставлять эти неупорядоченные) "$*" - это то же самое, что "$1 $2 ..." 1 "$@" - это то же самое, что "$1" "$2" ... 1. Аргументы разделяются первым символом $ IFS, который не должен быть пробелом. |
$# | Количество позиционных параметров, переданных скрипту или функции |
$! | Идентификатор процесса последней команды (самый высокий для конвейеров) в последнем задании, помещенном в фоновом режиме (обратите внимание, что это не обязательно совпадает с идентификатором группы задач задания, когда включено управление заданием) |
$$ | ID процесса, который выполнил bash |
$? | Выйти из последней команды |
$n | Позиционные параметры, где n = 1, 2, 3, ..., 9 |
${n} | Позиционные параметры (такие же, как указано выше), но n может быть> 9 |
$0 | В скриптах, путь, с которым был вызван скрипт; с bash -c 'printf "%s\n" "$0"' name args' : name (первый аргумент после встроенного скрипта), в противном случае argv[0] который получил bash . |
$_ | Последнее поле последней команды |
$IFS | Внутренний разделитель полей |
$PATH | Переменная среды PATH, используемая для поиска исполняемых файлов |
$OLDPWD | Предыдущий рабочий каталог |
$PWD | Настоящий рабочий каталог |
$FUNCNAME | Массив имен функций в стеке вызовов выполнения |
$BASH_SOURCE | Массив, содержащий исходные пути для элементов в массиве FUNCNAME . Может использоваться для получения пути к скрипту. |
$BASH_ALIASES | Ассоциативный массив, содержащий все указанные в настоящее время псевдонимы |
$BASH_REMATCH | Массив совпадений из последнего совпадения регулярных выражений |
$BASH_VERSION | Строка версии Bash |
$BASH_VERSINFO | Массив из 6 элементов с информацией о версии Bash |
$BASH | Абсолютный путь к текущей исполняемой оболочке Bash (эвристически определяемой bash на основе argv[0] и значением $PATH , может быть неправильным в случае с углами) |
$BASH_SUBSHELL | Уровень подошвы Bash |
$UID | Реальный (не эффективный, если отличается) Идентификатор пользователя процесса, запускающего bash |
$PS1 | Запрос основной командной строки; см. Использование переменных PS * |
$PS2 | Запрос дополнительной командной строки (используется для дополнительного ввода) |
$PS3 | Запрос третичной командной строки (используется в цикле выбора) |
$PS4 | Quaternary командной строки (используется для добавления информации с подробным выходом) |
$RANDOM | Псевдослучайное целое число от 0 до 32767 |
$REPLY | Переменная, используемая при read по умолчанию, если не указана переменная. Также используется для select возвращаемого пользователем значения |
$PIPESTATUS | Переменная массива, которая содержит значения статуса выхода для каждой команды в последнем запущенном конвейере переднего плана. |
Назначение переменной не должно иметь места до и после.
a=123
неa = 123
. Последний (знак равенства, окруженный пробелами) изолированно означает выполнение командыa
с аргументами=
и123
, хотя это также видно в операторе сравнения строк (который синтаксически является аргументом для[
или[[
или любого теста, который вы используете с помощью).
$ BASHPID
Идентификатор процесса (pid) текущего экземпляра Bash. Это не то же самое, что и переменная $$
, но часто дает тот же результат. Это новое в Bash 4 и не работает в Bash 3.
~> $ echo "\$\$ pid = $$ BASHPID = $BASHPID"
$$ pid = 9265 BASHPID = 9265
$ BASH_ENV
Переменная среды, указывающая на файл запуска Bash, который считывается при вызове сценария.
$ BASH_VERSINFO
Массив, содержащий полную информацию о версии, разбивается на элементы, гораздо удобнее, чем $BASH_VERSION
если вы просто ищете основную версию:
~> $ for ((i=0; i<=5; i++)); do echo "BASH_VERSINFO[$i] = ${BASH_VERSINFO[$i]}"; done
BASH_VERSINFO[0] = 3
BASH_VERSINFO[1] = 2
BASH_VERSINFO[2] = 25
BASH_VERSINFO[3] = 1
BASH_VERSINFO[4] = release
BASH_VERSINFO[5] = x86_64-redhat-linux-gnu
$ BASH_VERSION
Показывает версию bash, которая работает, это позволяет вам решить, можете ли вы использовать любые дополнительные функции:
~> $ echo $BASH_VERSION
4.1.2(1)-release
$ EDITOR
Редактор по умолчанию, который будет запущен любыми сценариями или программами, обычно vi или emacs.
~> $ echo $EDITOR
vi
$ имя_функции
Чтобы получить имя текущей функции - введите:
my_function()
{
echo "This function is $FUNCNAME" # This will output "This function is my_function"
}
Эта инструкция ничего не вернет, если вы внесете ее вне функции:
my_function
echo "This function is $FUNCNAME" # This will output "This function is"
$ HOME
Домашний каталог пользователя
~> $ echo $HOME
/home/user
$ HOSTNAME
Имя хоста, назначенное системе во время запуска.
~> $ echo $HOSTNAME
mybox.mydomain.com
$ HOSTTYPE
Эта переменная идентифицирует аппаратное обеспечение, может быть полезно определить, какие исполняемые файлы выполнить:
~> $ echo $HOSTTYPE
x86_64
$ ГРУППЫ
Массив, содержащий числа групп, в которых находится пользователь:
#!/usr/bin/env bash
echo You are assigned to the following groups:
for group in ${GROUPS[@]}; do
IFS=: read -r name dummy number members < <(getent group $group )
printf "name: %-10s number: %-15s members: %s\n" "$name" "$number" "$members"
done
$ IFS
Содержит строку внутреннего разделителя полей, которую bash использует для разделения строк при циклировании и т. Д. По умолчанию используются символы пробела: \n
(новая строка), \t
(вкладка) и пробел. Изменение этого на что-то другое позволяет разделить строки с использованием разных символов:
IFS=","
INPUTSTR="a,b,c,d"
for field in ${INPUTSTR}; do
echo $field
done
Вышеуказанный результат:
a
b
c
d
Заметки:
- Это отвечает за явление, известное как расщепление слов .
$ LINENO
Выводит номер строки в текущем скрипте. В основном полезно при отладке скриптов.
#!/bin/bash
# this is line 2
echo something # this is line 3
echo $LINENO # Will output 4
$ MACHTYPE
Подобно $HOSTTYPE
выше, это также включает информацию об ОС, а также аппаратное обеспечение
~> $ echo $MACHTYPE
x86_64-redhat-linux-gnu
$ OLDPWD
OLDPWD (OLDP ечати Рабо D irectory) содержит каталог до последнего cd
команды:
~> $ cd directory
directory> $ echo $OLDPWD
/home/user
$ OSTYPE
Возвращает информацию о типе ОС, запущенной на машине, например.
~> $ echo $OSTYPE
linux-gnu
$ PATH
Путь поиска для поиска двоичных файлов для команд. Общие примеры включают /usr/bin
и /usr/local/bin
.
Когда пользователь или сценарий пытается выполнить команду, поиск путей в $PATH
выполняется, чтобы найти соответствующий файл с разрешением на выполнение.
Каталоги в $PATH
разделяются символом :
~> $ echo "$PATH"
/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin
Так, например, с учетом вышеуказанного $PATH
, если вы lss
в приглашении, оболочка будет искать /usr/kerberos/bin/lss
, затем /usr/local/bin/lss
, then /bin/lss
, затем /usr/bin/lss
, в этом порядке, прежде чем заключить, что такой команды нет.
$ PPID
Идентификатор процесса (pid) сценария или родителя оболочки, что означает процесс, чем вызов текущего скрипта или оболочки.
~> $ echo $$
13016
~> $ echo $PPID
13015
$ PWD
PWD ( P rint W orking D- directory) Текущий рабочий каталог, в котором вы находитесь сейчас:
~> $ echo $PWD
/home/user
~> $ cd directory
directory> $ echo $PWD
/home/user/directory
$ SECONDS
Количество секунд, в течение которых скрипт запущен. Это может стать довольно большим, если отобразить в оболочке:
~> $ echo $SECONDS
98834
$ SHELLOPTS
В начало запускается список readonly параметров bash для управления его поведением:
~> $ echo $SHELLOPTS
braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor
$ SHLVL
Когда команда bash выполняется, открывается новая оболочка. Переменная среды $ SHLVL содержит количество уровней оболочки, на которых работает текущая оболочка.
В новом окне терминала выполнение следующей команды приведет к различным результатам на основе используемого дистрибутива Linux.
echo $SHLVL
Используя Fedora 25 , выход «3». Это указывает на то, что при открытии новой оболочки исходная команда bash выполняет и выполняет задачу. Начальная команда bash выполняет дочерний процесс (другая команда bash), которая, в свою очередь, выполняет окончательную команду bash, чтобы открыть новую оболочку. Когда новая оболочка открывается, она запускается как дочерний процесс из двух других процессов оболочки, следовательно, выход «3».
В следующем примере (учитывая, что пользователь запускает Fedora 25), вывод $ SHLVL в новой оболочке будет установлен на «3». Поскольку каждая команда bash выполняется, $ SHLVL увеличивается на единицу.
~> $ echo $SHLVL
3
~> $ bash
~> $ echo $SHLVL
4
~> $ bash
~> $ echo $SHLVL
5
Можно видеть, что выполнение команды «bash» (или выполнение сценария bash) открывает новую оболочку. Для сравнения, поиск сценария запускает код в текущей оболочке.
test1.sh
#!/usr/bin/env bash
echo "Hello from test1.sh. My shell level is $SHLVL"
source "test2.sh"
test2.sh
#!/usr/bin/env bash
echo "Hello from test2.sh. My shell level is $SHLVL"
run.sh
#!/usr/bin/env bash
echo "Hello from run.sh. My shell level is $SHLVL"
./test1.sh
Выполнение:
chmod +x test1.sh && chmod +x run.sh
./run.sh
Выход:
Hello from run.sh. My shell level is 4
Hello from test1.sh. My shell level is 5
Hello from test2.sh. My shell level is 5
$ UID
Только переменная для чтения, которая хранит идентификационный номер пользователя:
~> $ echo $UID
12345
$ 1 $ 2 $ 3 и т. Д. ...
Позиционные параметры передаются скрипту из командной строки или из функции:
#!/bin/bash
# $n is the n'th positional parameter
echo "$1"
echo "$2"
echo "$3"
Вышеуказанный результат:
~> $ ./testscript.sh firstarg secondarg thirdarg
firstarg
secondarg
thirdarg
Если число позиционных аргументов больше девяти, необходимо использовать фигурные скобки.
# "set -- " sets positional parameters
set -- 1 2 3 4 5 6 7 8 nine ten eleven twelve
# the following line will output 10 not 1 as the value of $1 the digit 1
# will be concatenated with the following 0
echo $10 # outputs 1
echo ${10} # outputs ten
# to show this clearly:
set -- arg{1..12}
echo $10
echo ${10}
$ #
Чтобы получить количество аргументов командной строки или позиционных параметров - введите:
#!/bin/bash
echo "$#"
При запуске с тремя аргументами приведенный выше пример приведет к выводу:
~> $ ./testscript.sh firstarg secondarg thirdarg
3
$ *
Вернет все позиционные параметры в одну строку.
testscript.sh:
#!/bin/bash
echo "$*"
Запустите скрипт с несколькими аргументами:
./testscript.sh firstarg secondarg thirdarg
Выход:
firstarg secondarg thirdarg
$!
Идентификатор процесса (pid) последнего задания запускается в фоновом режиме:
~> $ ls &
testfile1 testfile2
[1]+ Done ls
~> $ echo $!
21715
$ _
Выводит последнее поле из последней выполненной команды, полезно, чтобы передать что-то другому в другую команду:
~> $ ls *.sh;echo $_
testscript1.sh testscript2.sh
testscript2.sh
Он дает путь к скрипту, если он используется перед любыми другими командами:
test.sh:
#!/bin/bash
echo "$_"
Выход:
~> $ ./test.sh # running test.sh
./test.sh
Примечание. Это не надежный способ получить путь к сценарию
$?
Статус выхода последней выполненной функции или команды. Обычно 0 будет означать ОК. Все остальное указывает на сбой:
~> $ ls *.blah;echo $?
ls: cannot access *.blah: No such file or directory
2
~> $ ls;echo $?
testfile1 testfile2
0
$$
Идентификатор процесса (pid) текущего процесса:
~> $ echo $$
13246
$ @
"$@"
расширяет все аргументы командной строки в виде отдельных слов. Он отличается от "$*"
, который расширяется до всех аргументов как одно слово.
"$@"
особенно полезен для циклического использования аргументов и обработки аргументов с пробелами.
Рассмотрим, что мы находимся в скрипте, который мы вызываем с двумя аргументами, например:
$ ./script.sh "␣1␣2␣" "␣3␣␣4␣"
Переменные $*
или $@
будут расширяться до $1␣$2
, которые, в свою очередь, расширятся на 1␣2␣3␣4
поэтому цикл ниже:
for var in $*; do # same for var in $@; do
echo \<"$var"\>
done
будет печатать для обоих
<1>
<2>
<3>
<4>
В то время как "$*"
будет расширен до "$1␣$2"
который, в свою очередь, будет расширяться до "␣1␣2␣␣␣3␣␣4␣"
и поэтому цикл:
for var in "$*"; do
echo \<"$var"\>
done
будет только один раз вызывать echo
и распечатать
<␣1␣2␣␣␣3␣␣4␣>
И, наконец, "$@"
расширится до "$1" "$2"
, который будет расширяться до "␣1␣2␣" "␣3␣␣4␣"
и поэтому цикл
for var in "$@"; do
echo \<"$var"\>
done
распечатает
<␣1␣2␣>
<␣3␣␣4␣>
тем самым сохраняя как внутреннее расстояние в аргументах, так и разделение аргументов. Заметим, что конструкция for var in "$@"; do ...
настолько распространен и идиоматичен, что он является значением по умолчанию для цикла for и может быть сокращен до for var; do ...
$ HISTSIZE
Максимальное количество запоминаемых команд:
~> $ echo $HISTSIZE
1000
$ RANDOM
Каждый раз, когда этот параметр ссылается, генерируется случайное целое число от 0 до 32767. Присвоение значения этой переменной сгенерирует генератор случайных чисел ( источник ).
~> $ echo $RANDOM
27119
~> $ echo $RANDOM
1349