Введение
В ходе этой лабораторной работы вы познакомитесь с фундаментальными операциями над строками в shell-скриптах. Работа со строками критически важна для манипулирования данными и извлечения информации из текста при автоматизации различных задач. Вы изучите такие концепции, как определение длины строки, поиск позиции символа, извлечение подстрок и замена фрагментов текста. Эти навыки необходимы для эффективной обработки текстовых данных в сценариях командной оболочки.
Краткий справочник
Ниже приведен обзор строковых операций, которые мы рассмотрим в этой работе:
| Операция | Синтаксис | Описание | Пример |
|---|---|---|---|
| Длина строки | ${#string} |
Вычисляет количество символов в строке | ${#"hello"} вернет 5 |
| Поиск позиции символа | $(expr index "$string" "$char") |
Находит позицию символа в строке (индексация с 1) | $(expr index "abcdef" "c") вернет 3 |
| Извлечение подстроки | ${string:start:length} |
Извлекает часть строки (индексация с 0) | ${"hello":1:3} вернет ell |
| Замена первого вхождения | ${string/pattern/replacement} |
Заменяет первое совпадение с шаблоном | ${"hello"/l/L} вернет heLlo |
| Замена всех вхождений | ${string//pattern/replacement} |
Заменяет все совпадения с шаблоном | ${"hello"//l/L} вернет heLLo |
| Замена в начале | ${string/#pattern/replacement} |
Заменяет шаблон, только если он в начале строки | ${"hello"/#he/HE} вернет HEllo |
| Замена в конце | ${string/%pattern/replacement} |
Заменяет шаблон, только если он в конце строки | ${"hello"/%lo/LO} вернет helLO |
Создание файла скрипта
Начнем с создания файла скрипта, в котором мы будем писать наши операции со строками.
Откройте терминал в WebIDE. Терминал — это место, где вы вводите команды для взаимодействия с системой Linux.
Перейдите в каталог проекта:
cd ~/projectЭта команда меняет текущий рабочий каталог на
~/project. Символ~обозначает ваш домашний каталог, поэтому~/project— это папка с именем "project" в вашем домашнем каталоге.Создайте новый файл с именем
string_operations.sh:touch string_operations.shКоманда
touchсоздает новый пустой файл. Если файл уже существует, она просто обновляет метку времени файла.Откройте файл в редакторе WebIDE. Вы можете сделать это, щелкнув по имени файла в проводнике слева.
Добавьте следующую строку "shebang" в самое начало файла, чтобы указать интерпретатор:
#!/bin/bashЭта строка, называемая "shebang", сообщает системе, что для интерпретации этого скрипта нужно использовать оболочку Bash. Это всегда должна быть первая строка в shell-скрипте.
Длина строки
Теперь давайте научимся определять длину строки.
Добавьте следующий код в файл
string_operations.sh:echo "Step 2: String Length" STRING="Hello, World!" LENGTH=${#STRING} echo "The string is: $STRING" echo "Its length is: $LENGTH"Разберем этот код пошагово:
Сначала мы используем команду echo для вывода заголовка этого раздела.
echo "Step 2: String Length"Затем мы определяем переменную
STRINGи присваиваем ей значение "Hello, World!".STRING="Hello, World!"В Bash не нужно использовать специальные ключевые слова для определения переменных. Мы просто пишем имя переменной, затем знак равенства и значение.
Далее мы вычисляем длину строки, используя синтаксис
${#variable}, и сохраняем результат в переменнуюLENGTH.LENGTH=${#STRING}Конструкция
${#variable}— это специальное расширение параметров оболочки, которое возвращает количество символов в строке, хранящейся в переменной.Наконец, мы выводим на экран исходную строку и её длину.
echo "The string is: $STRING" echo "Its length is: $LENGTH"Символ
$перед именем переменной указывает Bash заменить его значением этой переменной.
Сохраните файл. В большинстве редакторов это можно сделать нажатием Ctrl+S (или Cmd+S на Mac).
Сделайте скрипт исполняемым:
chmod +x string_operations.shЭта команда изменяет права доступа к файлу, чтобы его можно было запустить:
chmodозначает "change mode" (изменить режим)+xозначает "add execute permission" (добавить право на выполнение)- Без этого шага система не будет знать, что этот файл следует рассматривать как программу.
Запустите скрипт:
./string_operations.shПрефикс
./указывает оболочке искать скрипт в текущем каталоге. Без него оболочка искала бы файл только в каталогах, перечисленных в переменной окружения PATH.
Вы должны увидеть вывод, похожий на этот:
Step 2: String Length
The string is: Hello, World!
Its length is: 13
Если вы не видите этого вывода, убедитесь, что вы сохранили файл и сделали его исполняемым.
Поиск позиции символа
Далее мы научимся находить позицию конкретного символа в строке.
Добавьте следующий код в файл
string_operations.sh:echo -e "\nStep 3: Finding Character Position" STRING="abcdefghijklmnopqrstuvwxyz" CHAR="j" POSITION=$(expr index "$STRING" "$CHAR") echo "The string is: $STRING" echo "We're looking for the character: $CHAR" echo "It is at position: $POSITION"Рассмотрим этот код подробно:
Мы начинаем с команды echo с опцией
-eи управляющей последовательностью\n.echo -e "\nStep 3: Finding Character Position"- Опция
-eвключает интерпретацию управляющих последовательностей. \nдобавляет пустую строку перед текстом, создавая визуальное разделение разделов.
- Опция
Затем мы определяем две переменные:
STRING="abcdefghijklmnopqrstuvwxyz" CHAR="j"STRINGсодержит весь строчный алфавит.CHARсодержит символ "j", который мы будем искать.
Мы используем команду
expr indexдля поиска позиции символа:POSITION=$(expr index "$STRING" "$CHAR")expr— это утилита для вычисления выражений.- Операция
indexищет символы в строке. - Синтаксис
$()перехватывает вывод команды и присваивает его переменнойPOSITION. - Мы заключаем переменные в двойные кавычки (
"$STRING"), чтобы избежать проблем со специальными символами. - Важно: Эта команда возвращает позицию, начиная с 1 (а не с 0).
Наконец, выводим результаты:
echo "The string is: $STRING" echo "We're looking for the character: $CHAR" echo "It is at position: $POSITION"
Сохраните файл и снова запустите скрипт:
./string_operations.sh
Вы увидите дополнительный вывод:
Step 3: Finding Character Position
The string is: abcdefghijklmnopqrstuvwxyz
We're looking for the character: j
It is at position: 10
Обратите внимание, что позиция отсчитывается от 1, то есть первый символ находится в позиции 1, а не 0. Это отличается от многих языков программирования, где индексация обычно начинается с нуля.
Извлечение подстроки
Теперь научимся извлекать часть строки.
Добавьте следующий код в файл
string_operations.sh:echo -e "\nStep 4: Substring Extraction" STRING="The quick brown fox jumps over the lazy dog" START=10 LENGTH=5 SUBSTRING=${STRING:$START:$LENGTH} echo "The original string is: $STRING" echo "Extracting 5 characters starting from position 10:" echo "The substring is: $SUBSTRING"Проанализируем этот фрагмент:
Сначала добавляем заголовок с новой строкой:
echo -e "\nStep 4: Substring Extraction"Определяем переменные:
STRING="The quick brown fox jumps over the lazy dog" START=10 LENGTH=5STRINGсодержит пример предложения.START— это позиция, с которой мы хотим начать извлечение (позиция 10).LENGTH— количество символов, которые нужно извлечь (5 символов).
Используем синтаксис извлечения подстроки Bash:
SUBSTRING=${STRING:$START:$LENGTH}- Синтаксис выглядит так:
${variable:start_position:length} $STARTи$LENGTH— это переменные со значениями 10 и 5.- Важно: В отличие от команды
expr index, здесь позиции отсчитываются от 0, то есть первый символ находится в позиции 0.
- Синтаксис выглядит так:
Выводим результаты:
echo "The original string is: $STRING" echo "Extracting 5 characters starting from position 10:" echo "The substring is: $SUBSTRING"
Сохраните файл и запустите скрипт:
./string_operations.sh
Вы увидите следующий вывод:
Step 4: Substring Extraction
The original string is: The quick brown fox jumps over the lazy dog
Extracting 5 characters starting from position 10:
The substring is: brown
В строке "The quick brown fox..." позиция 10 (при отсчете от 0) — это буква 'b' в слове "brown", а следующие 5 символов составляют слово "brown". Именно поэтому наша извлеченная подстрока — "brown".
Помните о разнице в индексации:
- В
expr index(Шаг 3) позиции начинаются с 1. - В извлечении подстроки
${STRING:position:length}(Шаг 4) позиции начинаются с 0.
Это частая причина путаницы в shell-скриптах, поэтому важно помнить, какая операция какую систему индексации использует.
Замена строк
Наконец, научимся заменять части строки.
Добавьте следующий код в файл
string_operations.sh:echo -e "\nStep 5: String Replacement" STRING="The quick brown fox jumps over the lazy dog" echo "Original string: $STRING" ## Замена первого вхождения 'o' на 'O' NEW_STRING=${STRING/o/O} echo "Replacing first 'o' with 'O': $NEW_STRING" ## Замена всех вхождений 'o' на 'O' NEW_STRING=${STRING//o/O} echo "Replacing all 'o' with 'O': $NEW_STRING" ## Замена 'The quick' на 'The slow', если это в начале строки NEW_STRING=${STRING/#The quick/The slow} echo "Replacing 'The quick' with 'The slow' at the beginning: $NEW_STRING" ## Замена 'dog' на 'cat', если это в конце строки NEW_STRING=${STRING/%dog/cat} echo "Replacing 'dog' with 'cat' at the end: $NEW_STRING"Разберем каждую операцию замены:
Выводим заголовок и исходную строку:
echo -e "\nStep 5: String Replacement" STRING="The quick brown fox jumps over the lazy dog" echo "Original string: $STRING"Замена первого вхождения символа:
## Замена первого вхождения 'o' на 'O' NEW_STRING=${STRING/o/O} echo "Replacing first 'o' with 'O': $NEW_STRING"- Синтаксис:
${variable/pattern/replacement} - Это найдет первое вхождение 'o' и заменит его на 'O'.
- Будет заменена только первая буква 'o' в слове "brown", остальные останутся прежними.
- Синтаксис:
Замена всех вхождений символа:
## Замена всех вхождений 'o' на 'O' NEW_STRING=${STRING//o/O} echo "Replacing all 'o' with 'O': $NEW_STRING"- Синтаксис:
${variable//pattern/replacement}(обратите внимание на двойной слэш) - Двойной слэш указывает Bash заменить ВСЕ совпадения с шаблоном.
- Все буквы 'o' во всей строке будут заменены на 'O'.
- Синтаксис:
Замена шаблона в начале строки:
## Замена 'The quick' на 'The slow', если это в начале строки NEW_STRING=${STRING/#The quick/The slow} echo "Replacing 'The quick' with 'The slow' at the beginning: $NEW_STRING"- Синтаксис:
${variable/#pattern/replacement} - Символ
#указывает, что шаблон должен находиться строго в начале строки.
- Синтаксис:
Замена шаблона в конце строки:
## Замена 'dog' на 'cat', если это в конце строки NEW_STRING=${STRING/%dog/cat} echo "Replacing 'dog' with 'cat' at the end: $NEW_STRING"- Синтаксис:
${variable/%pattern/replacement} - Символ
%указывает, что шаблон должен находиться строго в конце строки.
- Синтаксис:
Сохраните файл и запустите скрипт:
./string_operations.sh
Вы увидите вывод:
Step 5: String Replacement
Original string: The quick brown fox jumps over the lazy dog
Replacing first 'o' with 'O': The quick brOwn fox jumps over the lazy dog
Replacing all 'o' with 'O': The quick brOwn fOx jumps Over the lazy dOg
Replacing 'The quick' with 'The slow' at the beginning: The slow brown fox jumps over the lazy dog
Replacing 'dog' with 'cat' at the end: The quick brown fox jumps over the lazy cat
Эти операции замены являются мощными инструментами для манипулирования текстом. Они позволяют выполнять точечные изменения на основе шаблонов и позиций, что особенно полезно для таких задач, как обработка данных, форматирование текста или изменение содержимого файлов.
Резюме
В ходе этой лабораторной работы вы изучили и применили на практике несколько фундаментальных операций со строками в shell-скриптах:
- Создание и запуск shell-скрипта.
- Вычисление длины строки с помощью
${#string}. - Поиск позиции символа в строке с помощью
$(expr index "$string" "$char"). - Извлечение подстроки из более длинной строки с помощью
${string:start:length}. - Выполнение различных операций замены:
${string/pattern/replacement}— замена первого вхождения.${string//pattern/replacement}— замена всех вхождений.${string/#pattern/replacement}— замена в начале строки.${string/%pattern/replacement}— замена в конце строки.
Эти навыки составляют основу для более сложных задач по обработке текста. По мере работы с shell-скриптами вы обнаружите, что эти операции неоценимы для анализа и преобразования текстовых данных в ваших проектах. Помните, что практика — залог мастерства, поэтому не бойтесь экспериментировать с различными строками и операциями!



