Переменные Shell
В программировании на Shell переменная — это имя, используемое для хранения значения данных.
При определении переменной имя переменной не включает знак доллара ($, как требуется для переменных в PHP), например:
Обратите внимание, что между именем переменной и знаком равенства не должно быть пробелов, что может отличаться от всех языков программирования, с которыми вы знакомы. В то же время при именовании переменных необходимо соблюдать следующие правила:
- Содержать только буквы, цифры и символы подчёркивания:Имена переменных могут содержать буквы (с учётом регистра), цифры и символы подчёркивания_, и не могут содержать другие специальные символы.
- Не могут начинаться с цифры:Имена переменных не могут начинаться с цифры, но могут содержать цифры.
- Избегайте использования ключевых слов 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)
Приведённый выше оператор использует цикл для вывода имён файлов в каталоге /etc.
Использование переменных
Чтобы использовать определённую переменную, просто добавьте знак доллара перед именем переменной, например:
Пример
echo $your_name
echo ${your_name}
Фигурные скобки вокруг имени переменной необязательны; вы можете добавлять их или нет. Добавление фигурных скобок помогает интерпретатору определить границу переменной, как в следующем случае:
Пример
echo "I am good at ${skill}Script"
done
Если вы не добавите фигурные скобки к переменной skill и напишете echo "I am good at $skillScript", интерпретатор будет рассматривать $skillScript как переменную (с пустым значением), и результат выполнения кода будет не таким, как мы ожидали.
Рекомендуется добавлять фигурные скобки ко всем переменным; это хорошая привычка программирования.
Определённую переменную можно переопределить, например:
Пример
echo $your_name
your_name="alibaba"
echo $your_name
Это допустимо, но обратите внимание, что при втором присваивании нельзя писать $your_name="alibaba"; знак доллара ($) добавляется только при использовании переменной.
Переменные только для чтения
Использование команды readonly позволяет объявить переменную доступной только для чтения; значение переменной только для чтения невозможно изменить.
В следующем примере делается попытка изменить переменную только для чтения, что приводит к ошибке:
Пример
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 не может удалять переменные только для чтения.
Пример
Пример
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'
Ограничения для строк в одинарных кавычках:
- Любой символ внутри одинарных кавычек будет выведен буквально, а переменные в строках с одинарными кавычками не раскрываются;
- Одинарная кавычка не может появляться в строке в одинарных кавычках отдельно (даже если экранировать одинарную кавычку), но они могут появляться парами для конкатенации строк.
Двойные кавычки
Пример
str="Привет, я знаю, что ты \"$your_name\"! \n"
echo -e $str
Вывод:
Hello, I know you are "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} !
Получение длины строки
Пример
echo ${#string} # Выводит 4
Когда переменная является строкой,${#string}эквивалентно${#string[0]}:
Пример
echo ${#string[0]} # Выводит 4
Извлечение подстрок
Следующий пример начинается с2символа строки и начинает извлекать4символов:
Пример
echo ${string:1:4} # Выводит unoo
Примечание: значение индекса первого символа равно0。
Поиск подстрок
Найдите позицию символаiилиo(учитывается та буква, которая встречается первой):
Пример
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 также можно использовать другие символы:
Пример
Это закомментированная часть.
Она может содержать несколько строк.
COMMENT
:<<'
Содержимое комментария...
Содержимое комментария...
Содержимое комментария...
'
:<<!
Содержимое комментария...
Содержимое комментария...
Содержимое комментария...
!
Использовать знак : напрямую
Мы также можем использовать команду двоеточия:и заключать несколько строк содержимого в одинарные кавычки'. Поскольку двоеточие — это пустая команда, это содержимое не будет выполнено.
Формат:: + пробел + одинарная кавычка。
Пример
Это закомментированная часть.
Она может содержать несколько строк.
'