English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Переменные Shell

Определение переменных, имена переменных не должны содержать символ доллара ($, переменные в языке PHP требуют этого), например:

your_name="oldtoolbag.com"

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

  •             Имя может состоять только из латинских букв, цифр и подчеркивания, первый символ не может начинаться с цифры.

  •             Запрещено использовать пробелы в середине, можно использовать символ подчеркивания (_).

  •             Запрещено использовать знаки препинания.

  •             Запрещено использовать ключевые слова bash (можно проверить помощью команды help, чтобы увидеть сохранённые ключевые слова).

Примеры правильных имён переменных Shell приведены ниже:

w3codebox
LD_LIBRARY_PATH
_var
var2

Неправильное имя переменной:

?var=123
user*name=w3codebox

Кроме явного прямого присвоения, можно присвоить переменной значение с помощью строки, например:

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

Данные строки будут циклически выводить имена файлов в каталоге /etc.

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

Использование определенной переменной возможно, достаточно добавить символ доллара перед именем переменной, например:

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

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

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

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

Рекомендуется добавлять фигурные скобки ко всем переменным, это guter программистский习惯了.

Определенные переменные могут быть заново определены, например:

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://ru.oldtoolbag.com"

Запуск скрипта, результат如下:}

/bin/sh: NAME: Эта переменная только для чтения.

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

Использование команды unset можно удалить переменные. Грамматика:

unset variable_name

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

Пример

#!/bin/sh
myUrl="https://ru.oldtoolbag.com"
unset myUrl
echo $myUrl

Исполнение вышеуказанного примера не выведет ничего.

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

Когда запускается shell, существуют три типа переменных:

  • 1) Локальные переменныеЛокальные переменные определяются в скрипте или команде и действуют только в текущем примере shell, другие программы, запущенные shell, не могут обращаться к локальным переменным.

  • 2) Переменные окруженияВсе программы, включая программы, запущенные shell, могут обращаться к переменным окружения, некоторые программы требуют переменных окружения для обеспечения их нормальной работы. В случае необходимости shell-скрипт также может определить переменные окружения.

  • 3) Shell-переменныеShell-переменные - это особые переменные, установленные shell-программой. В shell-переменных есть часть переменных окружения и часть локальных переменных, которые обеспечивают нормальное функционирование shell

Shell-строки

Строки - это один из самых常用ных и полезных типов данных в программировании на shell (кроме чисел и строк, больше нет других типов, которые можно использовать), строки могут быть заключены в одинарные, двойные кавычки, или вообще без них.

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

str='this is a string'

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

  •             Любой символ в одинарных кавычках выводится в том виде, в каком он есть, переменные в одинарных строках не действительны;

  •             В строке с одинарными кавычками не может быть одного одинарного кавычка (даже если он экранируется управляющим символом), но они могут出现在 паре, чтобы использоваться для склеивания строк.

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

your_name='w3codebox'
str="Hello, Я знаю, что вы являетесь \
echo -e $str

Результат вывода:

Hello, Я знаю, что вы являетесь "w3codebox"!

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

  •             В двойных кавычках могут быть переменные

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

Сшивка строк

your_name="w3codebox"
# Использование двойных кавычек для склеивания
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, w3codebox ! hello, w3codebox !
hello, w3codebox ! hello, ${your_name} !

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

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

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

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

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

Внимание:Индекс первой литера - 0.

Искать подстроку

Искать символ i или o Позиция (которая литера появляется первой):

string="w3codebox 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

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

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

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

${массив_имя[индекс]}

Например:

valuen=${array_name[n]}

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

echo ${array_name[@]}

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

Метод получения длины массива аналогичен методу получения длины строки, например:

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

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

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

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

#--------------------------------------------
# Это комментарий
# author: Основной учебник
# site: ru.oldtoolbag.com
# slogan: Изучите основы, чтобы идти дальше!
#--------------------------------------------
##### Начало области конфигурации пользователя #####
#
#
# Здесь можно добавить информацию о скрипте
# 
#
##### Конец области конфигурации пользователя #####

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

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

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

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

:<<EOF
Комментарий...
Комментарий...
Комментарий...
EOF

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

:<<'
Комментарий...
Комментарий...
Комментарий...
'
:<<!
Комментарий...
Комментарий...
Комментарий...
!