Переменные в Linux
Переменные
~$ variable=12 #Имя переменной
~$ echo $variable #Ссылка на переменную
12
~$ echo "Мне $variable лет" #Упрощенная форма ${variable}
Мне 12 лет
~$ echo "Мне ${variable} лет" #Строгая форма
Мне 12 лет
#Присваивание результата выполнения команды в переменную
$a=`ls -l`
#Более современный метод присваивания
a=$(ls -l)
Использование кавычек при выводе переменных
Заключение ссылки на переменную в кавычки сохраняет пробельные символы
Если в значениях переменных встречаются пробелы,то использование кавычек обязательно
~$ hello="A B C D"
~$ echo $hello
A B C D
~$ echo "$hello"
A B C D
#Вывод значения переменной в одинарных кавычках
~$ echo '$hello'
$hello
#Другой пример
a=`ls -l`
echo $a #Все будет в одной строке без пробелов
echo "$a" #Вывод будет таким же как если выполнить команду ls -l из командной строке
Переменные окружения
При запуске командного интерпретатора, для него и дочерних процессов создаются переменные окружения
При изменении переменных окружения, их необходимо экспортировать или по другом передать окружению, локальному по отношению к сценарию. Данную функцию выполняет команду export
Сценарий может экспортировать переменные только дочернему процессу, командам и процессам запускаемых из локального сценария
Сценарий запускаемый из командной оболочки не может экспортировать данные командной оболочке, по другому дочерний процесс не может экспортировать переменные родительскому процессу
Позиционные параметры
Позиционные параметры - это аргументы которые передаются из командной строки в скрипт
$0, $1, $2 и т.д.
Аргументы больше $9, должны заключаться в фигурные скобки: ${10}, ${11} и т.д.
Специальные аргументы: $* И $@ содержат все позиционные параметры
$# - кол-во аргументов командой строки
$* - все аргументы в виде одной строки
$@ - то же самое, что и $*, но при этом каждый параметр представлен как отдельная строка
#!/bin/bash
E_BADARGS=65
if [ ! -n "$1" ]
then
echo "Порядок использования: command \$arg1 \$arg2 \$arg3"
exit "$E_BADARGS"
fi
echo
index=1
echo "Список аргументов в переменной \$*: "
for arg in "$*"
do
echo "Аргумент $index = $arg"
let "index+=1"
done
index=1
echo "Список аргументов в переменной: \$@ "
for arg in "$@"
do
echo "Аргумент $index = $arg"
let "index+=1"
done
~$ ./test.sh a b c d
Список аргументов в переменной $*:
Аргумент 1 = a b c d
Список аргументов в переменной: $@
Аргумент 1 = a
Аргумент 2 = b
Аргумент 3 = c
Аргумент 4 = d
Внутренние переменные
#Путь к исполняемому файлу bash
$BASH
#Содержимое вершины стека каталогов
$DIRSTACK
dirs
#Заданный по умолчанию редактор
$EDITOR
#Идентификационный номер пользователя
$EUID
#Идентификационный номер группы которой принадлежит пользователь
$GROUPS
#Домашний каталог пользователя
$HOME
#Сетевое имя хоста устанавливаемое командой hostname
$HOSTNAME
#Идентифицирует аппаратную архитектуру
echo $HOSTTYPE
x86_64
echo $MACHTYPE
x86_64-pc-linux-gnu
#Разделитель полей во вводимой строке, по умолчанию пробел, может быть изменен, например, для разбора строк, в которых отдельные поля разделены запятыми
#при составлении содержимого переменной $*, Bash использует первый символ из $IFS для разделения аргументов
$IFS
bash -c 'set w x y z; IFS=":-;"; echo "$*"'
#Тип операционной системы
$OSTYPE
#Время работы сценария в секундах
$SECONDS
#Пример
echo $SECONDS
sleep 3
echo $SECONDS
sleep 3
echo $SECONDS
#Еще один пример
while [ "$SECONDS" -le 10 ]
do
sleep 1;
echo "Сценарий проработал $SECONDS секунд"
done
#Список допустимых опций интерпретатора SHELL
echo $SHELLOPTS
braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor
set
Команда set изменяет значения внутренних переменных сценария. Она может использоваться для переключения опций ( ключей, флагов ), определяющих поведение скрипта.
Команда set может также применяться для сброса и установки позиционных параметров, значения которых будут восприняты как результат выполнения команды ( set `command` )
Вызов set без параметров просто выводит список инициализированных переменных окружения
set `uname -a` # Изменение аргументов значения которых берутся из результата работы `uname -a`
echo "Аргументы после вызова set \`uname -a\` :"
# $1, $2, $3 и т.д. будут переустановлены в соответствии с выводом команды `uname -a`
echo "Поле #1 'uname -a' = $1"
echo "Поле #2 'uname -a' = $2"
echo "Поле #3 'uname -a' = $3"
Если команда set используется с ключом "--", после которого следует переменная, то значение переменной переносится в позиционные параметры (аргументы). Если имя переменной отсутствует, то эта команда приводит к сбросу позиционных параметров
#!/bin/bash
a='один'
b='два'
c='три'
set -- $a $b $c
echo "Поле #1 'uname -a' = $1"
echo "Поле #2 'uname -a' = $2"
echo "Поле #3 'uname -a' = $3"
Команда unset удаляет переменную, фактически - устанавливает ее значение в null. Обратите внимание: эта команда не может сбрасывать позиционные параметры (аргументы)
Команда export экспортирует переменную, делая ее доступной дочерним процессам. К сожалению, невозможно экспортировать переменную родительскому процессу
Допускается объединение инициализации и экспорта переменной в одну инструкцию: export var1=xxx
declare, typeset, readonly
readonly то же самое, что и declare -r, делает переменную доступной только для чтения, т.е. переменная становится подобна константе.
a="test1"
b="test2"
declare -r a
a="test3"
-bash: a: переменная только для чтения
readonly b
b="test3"
-bash: b: переменная только для чтения
Источники
Связанные темы
Использование команды tee в Linux
Использование wget и curl в Linux
Команда chattr и lsattr в Linux
Использование awk Linux Alpine
Блокировка пользователя в Linux
Проверка на необходимость перезапуска после обновления пакетов
Стандартные потоки и перенаправление ввода/вывода в Linux
Архивирование и сжатие файлов в Linux
Полезные команды и скрипты Linux
Условная конструкция if в Linux
Использование оператора select в языке shell
Внутренние и внешние команды linux
Использование конструкции case в Linux