Вы, вероятно, знаете о переменных в сценариях оболочки Bash.
Как и другие языки программирования и сценариев, вы используете переменные для хранения данных, а затем ссылаетесь на них в будущих командах.
name="Linux AndreyEx" echo "Hello $name!"
И он напечатает «Hello Linux AndreyEx!».
Помимо приведенного выше примера, есть также удивительно большое количество вещей, которые вы можете делать с переменными, например, заполнение значения по умолчанию, когда переменная не установлена, и присвоение нескольких значений одной переменной.
Позвольте нам показать вам необычное и продвинутое использование переменных в сценариях bash.
Использование массивов
За исключением приведенного выше примера, наиболее распространенным типом переменных, которые вы найдете в Bash, являются массивы:
name=("Linux AndreyEx" "It's FOSS")
Приведенный выше пример присваивает так Linux AndreyExи в It’s FOSSкачестве значений для nameпеременной.
Но как вы подходите к доступу к каждому значению?
Если вы бежите echo $name, вы увидите, что он печатает первое значение, Linux AndreyEx. Чтобы получить доступ к другим значениям, вам нужно использовать другой синтаксис для переменных.
Чтобы начать извлекать другие значения, давайте начнем со следующего:
echo "Hello ${name}!"
Это основа того, что позволит вам получить все значения переменных, а также то, что позволит вам выполнять остальные методы взаимодействия с переменными на протяжении всей остальной части этой статьи.
Возвращаясь к вышеупомянутому примеру, вы можете использовать синтаксис ${variable[number]} для извлечения определенного элемента из переменной:
echo "Hello ${name[1]}!"
Это напечатает “Hello It’s FOSS!”
Если вы еще не видели из приведенного выше примера, первый элемент в массиве фактически начинается с 0, а не с 1.
Итак, чтобы вытащить Linux AndreyExзначение, вы должны потянуть элемент в позиции 0:
echo "Hello ${name[0]}!"
Аналогичным образом, простое опускание части [number] просто делает ее по умолчанию первым элементом в массиве (который имеет индекс 0).
И они составляют все типы переменных, которые вы действительно найдете внутри Bash.
Давайте теперь перейдем к тому, как вы действительно можете работать и изменять вывод этих переменных, когда мы их вызываем.
Установка значения, когда переменная не установлена
Вы можете вернуть переменную по умолчанию к определенной строке, если переменная не установлена следующим образом:
${variable:-string}
Возьмем этот пример:
echo "Hello ${name:-nobody}!"
Поскольку переменная nameне установлена, она будет установлена по умолчанию, nobodyи приведенная выше команда напечатает “Hello nobody!”.
Если переменная установлена заранее, будет использовано ее значение:
name="Linux AndreyEx" echo "Hello ${name:-nobody}!"
Приведенная выше команда выводит «Hello Linux AndreyEx!»
Установка значения, когда переменная будет уже установлена
Вы также можете установить переменную вернуть определенное значение, когда переменная будет установлена. Это приведет к тому, что переменная будет печатать определенную строку всякий раз, когда она установлена, и ничего не печатать, когда это не так.
Синтаксис этого метода аналогичен предыдущему, но вместо + используется знак -.
${variable:+string}
Возьмем этот пример, где имя переменной не задано. Таким образом, он не будет ничего печатать для этой переменной части, и вывод команды будет “Hello!”
echo "Hello ${name:+person}!"
Измените приведенный выше пример и установите переменную name. С помощью этого специального метода он не будет использовать уже установленное значение, а будет использовать то, которое вы указали.
name="Linux AndreyEx" echo "Hello ${name:+person}!"
Вышеупомянутая команда напечатает “Hello person!”.
Вероятно, вы найдете больше вариантов использования синтаксиса ${variable:-string}, поскольку некоторые из преимуществ ${variable:+string} уже могут быть достигнуты с помощью других инструментов, таких как оператор [] testing():
Косвенные ссылки на переменные
В следующем примере будет использоваться следующий синтаксис:
${!variable}
Этот вариант немного сложнее в том, как он работает, но он становится понятным после того, как вы увидите, как он работает:
name="Linux AndreyEx" variable="name" echo "Hello ${!variable}!"
Он напечатает «Hello Linux AndreyEx».
Cимвол ! перед именем переменной вызывает замену обычного имени переменной, но затем использует имя этой строки для поиска соответствующей переменной.
Так же:
- variable заменяется на строку name, за которой следует:
- name заменяется на его значение Linux AndreyEx.
Нахождение длины переменной
Воспользуемся предыдущим методом, но заменим символ ! на #:
${#variable}
При использовании этого метода будет напечатана длина переменной, но будет немного отличаться в зависимости от того, является ли переменная строкой или массивом.
Использование этого синтаксиса в строке приведет к замене переменной количества символов в строке.
variable="name" echo "Length is ${#variable}."
Он выдаст 4. Но, с другой стороны, при использовании его в массиве будет напечатано количество элементов внутри массива, то есть размер массива, который здесь равен 2.
variable=("name" "word") echo "Length is ${#variable}."
Строки в нижнем и верхнем регистре
И, наконец, вы можете извлечь выгоду и строчные буквы строки с использованием операторов ^ и, соответственно.
Вы указываете их в конце имени переменной следующим образом:
# Заглавные буквы ${variable^} ${variable^^} # Нижниq регистр ${variable,} ${variable,,}
В чем разница между одним и двумя персонажами?
Указание только одного ${variable^} приведет к изменению только первой буквы, а указание двух ( ${variable^^}) приведет к изменению всей строки.
В приведенном ниже примере печатается Name вместо name:
variable="name" echo "${variable^}"
Но этот печатает NAME:
variable="name" echo "${variable^^}"
Точно так же вы можете печатать переменные в нижнем регистре.
В приведенном ниже примере будет напечатано wIDEname:
variable="WIDEname" echo "${variable,}"
И этот напечатает widename:
variable="WIDEname" echo "${variable,,}"
Подведение итогов
Это лишь некоторые из способов использования переменных внутри Bash. Вы можете найти еще несколько способов взаимодействия с переменными в документации Bash по расширению переменных.
Есть вопросы о том, как работали приведенные выше примеры, или что-то просто не работает? Не стесняйтесь оставлять любые из них в разделе комментариев ниже.