Переменные Shell

В программировании на Shell переменная — это имя, используемое для хранения значения данных.

При определении переменной имя переменной не включает знак доллара ($, как требуется для переменных в PHP), например:

your_name="example"

Обратите внимание, что между именем переменной и знаком равенства не должно быть пробелов, что может отличаться от всех языков программирования, с которыми вы знакомы. В то же время при именовании переменных необходимо соблюдать следующие правила:

  • Содержать только буквы, цифры и символы подчёркивания:Имена переменных могут содержать буквы (с учётом регистра), цифры и символы подчёркивания_, и не могут содержать другие специальные символы.
  • Не могут начинаться с цифры:Имена переменных не могут начинаться с цифры, но могут содержать цифры.
  • Избегайте использования ключевых слов Shell:Не используйте ключевые слова Shell (такие как if, then, else, fi, for, while и т. д.) в качестве имён переменных, чтобы избежать путаницы.
  • Используйте прописные буквы для констант:По соглашению, имена переменных для констант обычно используют прописные буквы, напримерPI=3.14。
  • Избегайте использования специальных символов:Старайтесь избегать использования специальных символов в именах переменных, потому что они могут конфликтовать с синтаксисом Shell.
  • Избегайте использования пробелов:Имена переменных не должны содержать пробелы, потому что пробелы обычно используются для разделения команд и аргументов.

Примеры допустимых имён переменных Shell:

EXAMPLE="www.example.com"
LD_LIBRARY_PATH="/bin/"
_var="123"
var2="abc"

Недопустимое именование переменных:

# 避免使用if作为变量名
if="some_value"
# 避免使用 $ 等特殊符号
variable_with_$=42
?var=123
user*name=example
# 避免空格
variable with space="value"

Избегайте пробелов с обеих сторон знака равенства:

# 正确的赋值
variable_name=value

# 有可能会导致错误
variable_name = value

Помимо явного прямого присваивания, вы также можете использовать инструкции для присваивания значений переменным, например:

for file in `ls /etc`
или
for file in $(ls /etc)

Приведённый выше оператор использует цикл для вывода имён файлов в каталоге /etc.


Использование переменных

Чтобы использовать определённую переменную, просто добавьте знак доллара перед именем переменной, например:

Пример

your_name="qinjx"
echo $your_name
echo ${your_name}

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

Пример

for skill in Ada Coffe Action Java; do
    echo "I am good at ${skill}Script"
done

Если вы не добавите фигурные скобки к переменной skill и напишете echo "I am good at $skillScript", интерпретатор будет рассматривать $skillScript как переменную (с пустым значением), и результат выполнения кода будет не таким, как мы ожидали.

Рекомендуется добавлять фигурные скобки ко всем переменным; это хорошая привычка программирования.

Определённую переменную можно переопределить, например:

Пример

your_name="tom"
echo $your_name
your_name="alibaba"
echo $your_name

Это допустимо, но обратите внимание, что при втором присваивании нельзя писать $your_name="alibaba"; знак доллара ($) добавляется только при использовании переменной.

Переменные только для чтения

Использование команды readonly позволяет объявить переменную доступной только для чтения; значение переменной только для чтения невозможно изменить.

В следующем примере делается попытка изменить переменную только для чтения, что приводит к ошибке:

Пример

#!/bin/bash

myUrl="https://www.google.com"
readonly myUrl
myUrl="https://www.example.com"

Запустите скрипт, результат будет следующим:

/bin/sh: NAME: This variable is read only.

Удаление переменных

Используйте команду unset для удаления переменной. Синтаксис:

unset variable_name

Переменную нельзя использовать снова после её удаления. Команда unset не может удалять переменные только для чтения.

Пример

Пример

#!/bin/sh

myUrl="https://www.example.com"
unset myUrl
echo $myUrl

При выполнении приведённого выше примера не будет выведено никаких данных.

Типы переменных

Shell поддерживает различные типы переменных, и некоторые из основных типов включают:

Строковые переменные:В Shell переменные обычно рассматриваются как строки.

Вы можете использовать одинарные кавычки'или двойные кавычки"для определения строки, например:

my_string='Hello, World!'

或者

my_string="Hello, World!"

Целочисленные переменные: В некоторых оболочках можно использоватьdeclareилиtypesetкоманду для объявления целочисленных переменных.

Такие переменные содержат только целочисленные значения, например:

declare -i my_integer=42

Такое объявление указывает Shell обрабатывать my_integer как целое число. Если вы попытаетесь присвоить ему нецелое значение, Shell попытается преобразовать его в целое число.

Переменные-массивы:Shell также поддерживает массивы, позволяя хранить несколько значений в одной переменной.

Массивы могут быть массивами с целочисленными индексами или ассоциативными массивами. Ниже приведён пример простого массива с целочисленными индексами:

my_array=(1 2 3 4 5)

Или ассоциативные массивы:

declare -A associative_array
associative_array["name"]="John"
associative_array["age"]=30

Переменные окружения:Это специальные переменные, задаваемые операционной системой или пользователем, используемые для настройки поведения Shell и влияющие на среду его выполнения.

Например, переменная PATH содержит путь, по которому операционная система ищет исполняемые файлы:

echo $PATH

Специальные переменные:Существуют некоторые специальные переменные, имеющие особое значение в Shell, например$0обозначает имя скрипта,$1, $2, и т. д. представляют параметры скрипта.

$#представляет количество параметров, переданных скрипту,$?представляет статус выхода предыдущей команды и т. д.


Строки shell

Строки — наиболее часто используемый и наиболее полезный тип данных в программировании на shell (помимо чисел и строк, не так много других типов для использования). В строках можно использовать одинарные кавычки, двойные кавычки или не использовать кавычки.

Одинарные кавычки

str='this is a string'

Ограничения для строк в одинарных кавычках:

  • Любой символ внутри одинарных кавычек будет выведен буквально, а переменные в строках с одинарными кавычками не раскрываются;
  • Одинарная кавычка не может появляться в строке в одинарных кавычках отдельно (даже если экранировать одинарную кавычку), но они могут появляться парами для конкатенации строк.

Двойные кавычки

Пример

your_name="example"
str="Привет, я знаю, что ты \"$your_name\"! \n"
echo -e $str

Вывод:

Hello, I know you are "example"! 

Преимущества двойных кавычек:

  • Переменные можно использовать внутри двойных кавычек
  • Экранирующие символы могут появляться внутри двойных кавычек

Конкатенация строк

Пример

your_name="example"
# Конкатенация с помощью двойных кавычек
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting  $greeting_1

# Конкатенация с помощью одинарных кавычек
greeting_2='hello, '$your_name' !'
greeting_3='hello, ${your_name} !'
echo $greeting_2  $greeting_3

Вывод:

hello, example ! hello, example !
hello, example ! hello, ${your_name} !

Получение длины строки

Пример

string="abcd"
echo ${#string}   # Выводит 4

Когда переменная является строкой,${#string}эквивалентно${#string[0]}:

Пример

string="abcd"
echo ${#string[0]}   # Выводит 4

Извлечение подстрок

Следующий пример начинается с2символа строки и начинает извлекать4символов:

Пример

string="example is a great site"
echo ${string:1:4} # Выводит unoo

Примечание: значение индекса первого символа равно0。

Поиск подстрок

Найдите позицию символаiилиo(учитывается та буква, которая встречается первой):

Пример

string="example is a great site"
echo `expr index "$string" io`  # Выводит 4

Примечание:В приведённом выше скрипте`это обратный апостроф, а не одинарная кавычка', не перепутайте.


Массивы Shell

bash поддерживает одномерные массивы (не поддерживает многомерные массивы) и не ограничивает размер массива.

Как и в языке C, индексы элементов массива нумеруются начиная с 0. Чтобы получить доступ к элементу массива, нужно использовать индекс. Индекс может быть целым числом или арифметическим выражением, и его значение должно быть больше или равно 0.

Определение массивов

В Shell для представления массивов используются круглые скобки, а элементы массива разделяются символом «пробел». Общая форма определения массива такова:

数组名=(值1 值2 ... 值n)

Например:

array_name=(value0 value1 value2 value3)

или

array_name=(
value0
value1
value2
value3
)

Вы также можете определить отдельные компоненты массива по отдельности:

array_name[0]=value0
array_name[1]=value1
array_name[n]=valuen

Необязательно использовать последовательные индексы, и нет ограничений на диапазон индексов.

Чтение массивов

Общий формат для чтения значения элемента массива:

${array name [subscript]}

Например:

valuen=${array_name[n]}

Используйте символ@, чтобы получить все элементы массива, например:

echo ${array_name[@]}

Получение длины массива

Способ получения длины массива такой же, как и получение длины строки, например:

Пример

# Получить количество элементов массива
length=${#array_name[@]}
# Или
length=${#array_name[*]}
# Получить длину одного элемента массива
длина=${#array_name[n]}

Комментарии в Shell

с#Строки, начинающиеся с #, являются комментариями и будут игнорироваться интерпретатором.

Добавляя знак## к каждой строке, чтобы задать многострочные комментарии, например так:

Пример

#--------------------------------------------
# Это комментарий
# автор: Пример
# сайт:www.example.com
# слоган: То, что вы изучаете, — это не только технологии, но и мечты!
#--------------------------------------------
##### Начало области пользовательской конфигурации #####
#
#
# Добавьте здесь информацию с описанием скрипта
#
#
##### Конец области пользовательской конфигурации #####

Если во время разработки вы столкнётесь с большим блоком кода, который нужно временно закомментировать, а позже раскомментировать, что можно сделать?

Добавлять символ # в каждую строку слишком трудоёмко. Можно заключить блок кода, который нужно закомментировать, в пару фигурных скобок и определить его как функцию. Если функция никогда не вызывается, код не выполнится, что даёт тот же эффект, что и комментирование.

Многострочные комментарии

Использование Here-документов

Многострочные комментарии также могут использовать следующий формат:

:<<EOF
Содержимое комментария...
Содержимое комментария...
Содержимое комментария...
EOF

В приведённом выше примере,:— это пустая команда, используемая для выполнения следующего Here-документа,<<'EOF'обозначает начало Here-документа, COMMENT — идентификатор Here-документа, а содержимое между этими двумя идентификаторами будет рассматриваться как комментарий и не будет выполняться.

Вместо EOF также можно использовать другие символы:

Пример

: <<'COMMENT'
Это закомментированная часть.
Она может содержать несколько строк.
COMMENT


:<<'
Содержимое комментария...
Содержимое комментария...
Содержимое комментария...
'


:<<!
Содержимое комментария...
Содержимое комментария...
Содержимое комментария...
!

Использовать знак : напрямую

Мы также можем использовать команду двоеточия:и заключать несколько строк содержимого в одинарные кавычки'. Поскольку двоеточие — это пустая команда, это содержимое не будет выполнено.

Формат:: + пробел + одинарная кавычка。

Пример

: '
Это закомментированная часть.
Она может содержать несколько строк.
'

Другие расширения