Вам бонус- начислено 1 монета за дневную активность. Сейчас у вас 1 монета

24 - bash работа со строками

Лекция



Сразу хочу сказать, что здесь никакой воды про bash работа со строками, и только нужная информация. Для того чтобы лучше понимать что такое bash работа со строками, bash , настоятельно рекомендую прочитать все из категории Операционная система LINUX.

Это последняя лекция посвященная изучению bash. Сегодня мы поговорим о работе со строками, а также обсудим команды и конструкции bash, которые были упущены в предыдущих лекциях. Сначала рассмотрим одну из таких важных конструкций, а затем перейдем к обработке строк.

Во многих скриптах системы вы можете увидеть запись наподобие этой:

1
. /lib/lsb/init-functions

Это точка, после которой обязательно следует пробел и далее путь к файлу. Не путайте это с вариантом без пробела - ./lib/lsb/init-functionsТочка с пробелом после которой следует путь к текстовому файлу позволяет загрузить текст этого файла в текущий скрипт. Данный механизм можно сравнить с командой include в языке С. Этот механизм имеет большое практическое применение. Например, можно описать часто употребляемые функции в отдельном файле, а далее пользоваться функциями в других скриптах. Этот же механизм используется и для создания конфигурационных файлов. Рассмотрим практический пример. Создадим файл с именем testopt и со следующим содержанием:

1
2
3
4
#Конфигурационный файл
#Задаем опцию вывода на экран:
PRINT=YES
PRINT2=NO

Затем создадим еще один файл-скрипт с именем printopt.sh в том же каталоге, что и файл testopt:

1
2
3
4
#!/bin/bash
. testopt
if [ $PRINT = "YES" ]; then echo "PRINT"; fi
if [ $PRINT2 = "YES" ]; then echo "PRINT2"; fi

Когда интерпретатор bash начнет разбирать при запуске скрипт printopt.sh, то благодаря конструкции . testoptисполняемый файл будет для интерпретатора иметь следующий вид:

1
2
3
4
5
6
7
#!/bin/bash
#Конфигурационный файл
#Задаем опцию вывода на экран:
PRINT=YES
PRINT2=NO
if [ $PRINT = "YES" ]; then echo "PRINT"; fi
if [ $PRINT2 = "YES" ]; then echo "PRINT2"; fi

То есть на место . testopt подставляется содержимое (текст) файла testopt. Результат работы скрипта:

1
2
igor@ubuntu:~/linux$ ./printopt.sh 
PRINT

Работа со строками

Рассмотрим несколько приемов обработки строк в bash. Допустим есть переменная А, которой присвоена строка “QWERTY“. Чтобы вывести содержимое переменной на экран достаточно написать echo $A:

1
2
igor@ubuntu:~/linux$ A="QWERTY"; echo $A
QWERTY

Допустим хотим вывести такую строку - QWERTASD. Вариант $AASD не сработает, так как для bash - AASDбудет несуществующей переменной:

1
igor@ubuntu:~/linux$ A="QWERTY"; echo $AASD

Поэтому записать следует так: ${A}ASD:

1
2
igor@ubuntu:~/linux$ A="QWERTY"; echo ${A}ASD
QWERTYASD

Если необходимо отобразить строку с N-го символа, тогда используем конструкцию ${A:N}, где N - номер символа с которого будет отображена строка. Об этом говорит сайт https://intellect.icu . Символы в строке ведут нумерацию с нуля. Чтобы отобразить ERTYпишем:

1
2
igor@ubuntu:~/linux$ A="QWERTY"; echo ${A:2}
ERTY

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

Можно отобразить определенное количество символов начинаю с определенной позиции. Тогда записать нужно так ${A:N:M}, где N - номер символа с которого будет отображена строка, а M - количество отображаемых символов. Чтобы вывести из нашей строки QWERTY символы ER пишем:

1
2
igor@adm-ubuntu:~$ A="QWERTY"; echo ${A:2:2}
ER

Чтобы вывести QWE пишем так:

1
2
igor@adm-ubuntu:~$ A="QWERTY"; echo ${A::3}
QWE

Рассмотрим вот такую конструкцию:

1
2
3
4
igor@adm-ubuntu:~$ A="ABABABCDCD"; echo ${A#AB}
ABABCDCD
igor@adm-ubuntu:~$ A="123ABABABCDCD"; echo ${A#AB}
123ABABABCDCD

После символа # указываем шаблон, и если начало строки совпадает с этим шаблоном, то строка будет выведена без символов удовлетворяющих шаблону. Строка “123ABABABCDCD” начинается с 12 и шаблон AB не сработал, а вот если написать #*AB (или #???AB), то получим следующий результат:

1
2
3
4
igor@adm-ubuntu:~$ A="123ABABABCDCD"; echo ${A#*AB}
ABABCDCD
igor@adm-ubuntu:~$ A="123ABABABCDCD"; echo ${A#???AB}
ABABCDCD

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

1
2
igor@adm-ubuntu:~$ A="123ABABABCDCD"; echo ${A##*AB}
CDCD

Если у нас стоит один знак # то от строки отделяется минимум удовлетворяющий шаблону. То есть для“123ABABABCDCD” - это “123AB”. А если у нас два знака ##, то отделяется максимально возможная часть удовлетворяющая шаблону. То есть То есть для “123ABABABCDCD” - это “123ABABAB”, так как 123ABABподходит под *.

Если необходимо таким же образом убрать символы начиная с конца строки, то вместо # используем %. Правила те же, что и для #.

1
2
3
4
igor@adm-ubuntu:~$ A="123ABABABCDCD"; echo ${A%AB*}
123ABAB
igor@adm-ubuntu:~$ A="123ABABABCDCD"; echo ${A%%AB*}
123

Теперь посмотрим как в bash можно выполнять замену символов в строке. Допустим нужно в нашей строке“123ABABABCDCD” заменить символы AB на ZX, чтобы получилась строка “123ZXZXZXCDCD”. Для этого используем / или // и пишем так::

1
2
3
4
igor@adm-ubuntu:~$ A="123ABABABCDCD"; echo ${A/AB/ZX}
123ZXABABCDCD
igor@adm-ubuntu:~$ A="123ABABABCDCD"; echo ${A//AB/ZX}
123ZXZXZXCDCD

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

1
2
3
4
5
6
igor@adm-ubuntu:~$ echo ${options:="YES"}
YES
igor@adm-ubuntu:~$ echo $options
YES
igor@adm-ubuntu:~$ options="NO"; echo ${options:="YES"}
NO

Команду ${options:=”YES”} следует понимать так: если переменная options не существует, значит необходимосоздать ее и присвоить значение “YES”, а если переменная options существует, то используем ее истинное значение. В команде из последнего примера (строка 1), переменная options не существовала, поэтому она была создана и ей было присвоено значение YES, в следующей команде (строка 3), мы видим, что действительно переменная options была создана и ей было присвоено значение.
В следующей команде (строка 5) переменная options была создана со значением NO (то есть она существовала до команды echo ${options:=”YES”}) и поэтому было выведено именно это значение (NO).

Если необходимо выполнить такую же операцию, но не присваивать значение переменной, то пишем вместо =, символ -:

1
2
3
4
igor@adm-ubuntu:~$ echo ${options1:-"YES"}
YES
igor@adm-ubuntu:~$ echo $options1
                                                                          .

То есть, если переменная не существует, то она не создается, а вместо ее несуществующего значения используется указанное (в примере это “YES”). Данная конструкция работает если переменной не существует или она существует, но со значением нулевой длины.

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

1
2
3
4
igor@adm-ubuntu:~$ options="NO"; echo ${options:+"YES"}
YES
igor@adm-ubuntu:~$ echo $options
NO

То есть если переменная существует и ей присвоено значение ненулевой длины, то вывести вместо значения переменной указанное значение, а саму переменную не менять.

Команда read

Для некоторых видов скриптов (например инсталляционных), необходимо, чтобы пользователь вводил какие либо значения, и они могли быть использованы далее в скрипте. Для решения этой задачи в bash существует команда read. В простейшем случае команда записывается так: read P1 P2 …. PN, где P1 … PN - это имена параметров через пробел. Команда read считывает данные из потока ввода и записывает их в указанные переменные. В качестве разделителя для вводимых данных команда read использует значение которое хранится в системной переменой bash - IFS. Как правило - это пробел или табуляция. Рассмотрим пример скрипта:

1
2
3
4
5
#!/bin/bash
echo "Наберите ваши имя и фамилию через пробел и нажмите Enter:"
read P1 P2
echo "Ваше имя:$P1"
echo "Ваша фамилия:$P2"

И результат выполнения:

1
2
3
4
5
igor@adm-ubuntu:~/linux$ ./hello.sh
Наберите ваши имя и фамилию через пробел и нажмите Enter:
Igor Kuzmenko
Ваше имя:Igor
Ваша фамилия:Kuzmenko

Если изменить 5-ю строку скрипта на echo “Ваша фамилия:${P2:-”Фамилия отсутствовала”}”, то тогда, если не ввести фамилию будет выполнена подстановка указанного значения:

1
2
3
4
5
igor@adm-ubuntu:~/linux$ ./hello.sh
Наберите ваши имя и фамилию через пробел и нажмите Enter:
Игорь
Ваше имя:Игорь
Ваша фамилия:Фамилия отсутствовала

Команда read может выполняться с ключами. Наиболее значимые это:

-n - позволяет задать количество символов которое необходимо считать из потока ввода;
-t - позволяет задать количество секунд ожидания данных. Если пользователь ничего не ввел, то по истечении этого времени команда завершиться с ошибкой и скрипт будет выполнятся дальше.
-s - запрещает отображение вводимой информации на консоли. Используется для ввода конфиденциальной информации.

Справку о команде read можно получить из консоли по команде help read.

На этом наше знакомство с bash завершается. Рекомендую просмотреть скрипты из каталога /etc/init.d/, и попробовать понять теперь, что каждый из них выполняет. Так вы лучше поймете, что происходит при запуске той или иной службы или ее завершении, а соответственно и при запуске и завершении самой системы Linux. Мы конечно же рассмотрели не все команды. Хочу еще раз напомнить, что в bash могут использоваться как встроенные команды так и внешние. Если вы видите в скриптах незнакомую команду (возьмем к примеру ту жеread) и нет справки о ней по команде man read, вероятно это встроенная в bash команда нужно смотреть либо вman bash либо использовать help read.

Пожалуйста, пиши комментарии, если ты обнаружил что-то неправильное или если ты желаешь поделиться дополнительной информацией про bash работа со строками Надеюсь, что теперь ты понял что такое bash работа со строками, bash и для чего все это нужно, а если не понял, или есть замечания, то не стесняйся, пиши или спрашивай в комментариях, с удовольствием отвечу. Для того чтобы глубже понять настоятельно рекомендую изучить всю информацию из категории Операционная система LINUX

создано: 2014-09-13
обновлено: 2021-03-13
268



Рейтиг 9 of 10. count vote: 2
Вы довольны ?:


Поделиться:

Найди готовое или заработай

С нашими удобными сервисами без комиссии*

Как это работает? | Узнать цену?

Найти исполнителя
$0 / весь год.
  • У вас есть задание, но нет времени его делать
  • Вы хотите найти профессионала для выплнения задания
  • Возможно примерение функции гаранта на сделку
  • Приорететная поддержка
  • идеально подходит для студентов, у которых нет времени для решения заданий
Готовое решение
$0 / весь год.
  • Вы можите продать(исполнителем) или купить(заказчиком) готовое решение
  • Вам предоставят готовое решение
  • Будет предоставлено в минимальные сроки т.к. задание уже готовое
  • Вы получите базовую гарантию 8 дней
  • Вы можете заработать на материалах
  • подходит как для студентов так и для преподавателей
Я исполнитель
$0 / весь год.
  • Вы профессионал своего дела
  • У вас есть опыт и желание зарабатывать
  • Вы хотите помочь в решении задач или написании работ
  • Возможно примерение функции гаранта на сделку
  • подходит для опытных студентов так и для преподавателей

Комментарии


Оставить комментарий
Если у вас есть какое-либо предложение, идея, благодарность или комментарий, не стесняйтесь писать. Мы очень ценим отзывы и рады услышать ваше мнение.
To reply

Операционная система LINUX

Термины: Операционная система LINUX