Поиск…


Вступление

Обзор внутренних переменных 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


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow