Допустим у вас есть переменная str. В этой переменной некий текст в виде строки. Как вывести несколько символов из строки? Выводить текст при помощи цикла - это довольно долгое занятие. Поможет простая конструкция {?}. Вы можете вывести часть строки, передав параметр ${str:?}. Вместо ? поставьте индекс позиции символа. ${str:начало:конец} тут вы можете вывести значения согласно выбранному интервалу. Посмотрите на пример.
#!/bin/bash
str=abcABC123ABCabc
# 0123456789.....# Индексация начинается с 0.
echo ${str:0} # abcABC123ABCabc
echo ${str:1} # bcABC123ABCabc
echo ${str:7} # 23ABCabc
echo ${str:7:3} # 23A # Извлекает 3 символа.
# Возможна ли индексация с "правой" стороны строки?
echo ${str:-4} # abcABC123ABCabc
# По-умолчанию выводится полная строка.
# Однако . . .echo ${str:(-4)} # Cabc
echo ${str: -4} # Cabc
# Теперь выводится правильно.
# Круглые скобки или дополнительный пробел "экранируют" параметр позиции.
Как определить позицию индекс строки? Посмотрите на пример. expr - универсальный обработчик выражений: вычисляет заданное выражение (аргументы должны отделяться пробелами). Выражения могут быть логическими, арифметическими или строковыми.
#!/bin/bash
str=abcABC123ABCabc
echo `expr index "$str" C12`
#вывод: 6
# позиция символа C.
echo `expr index "$str" 1c`
#вывод: 3
# символ 'c' (в #3 позиции) совпал раньше, чем '1'.
#количество символов в строке
echo ${#str} # 15
echo `expr length $str` # 15
echo `expr "$str" : '.*'` # 15
Покажу поиск строк при помощи регулярных выражений. В примере все вышеприведенные операции дают один и тот же результат.
#!/bin/bash
str=abcABC123ABCabc
echo `expr match "$str" '\(.[b-c]*[A-Z]..[0-9]\)'` # abcABC1
echo `expr "$str" : '\(.[b-c]*[A-Z]..[0-9]\)'` # abcABC1
echo `expr "$str" : '\(.......\)'` # abcABC1