else
directory=$PWD # Иначе просматривается текущий каталог.
fi
# Все файлы в каталоге, имеющие расширение ".mac", считаются файлами
#+ формата MacPaint.
for file in $directory/* # Подстановка имен файлов.
do
filename=${file%.*c} # Удалить расширение ".mac" из имени файла
#+ ( с шаблоном '.*c' совпадают все подстроки
#+ начинающиеся с '.' и заканчивающиеся 'c',
$OPERATION $file > "$filename.$SUFFIX"
# Преобразование с перенаправлением в файл с новым именем
rm -f $file # Удаление оригинального файла после преобразования.
echo "$filename.$SUFFIX" # Вывод на stdout.
done
exit 0
# Упражнение:
# --------
# Сейчас этот сценарий конвертирует *все* файлы в каталоге
# Измените его так, чтобы он конвертировал *только* те файлы,
#+ которые имеют расширение ".mac".
Замена подстроки
${string/substring/replacement}
Замещает первое вхождение $substring строкой $replacement .
${string//substring/replacement}
Замещает все вхождения $substring строкой $replacement .
stringZ=abcABC123ABCabc
echo ${stringZ/abc/xyz} # xyzABC123ABCabc
# Замена первой подстроки 'abc' строкой 'xyz'.
echo ${stringZ//abc/xyz} # xyzABC123ABCxyz
# Замена всех подстрок 'abc' строкой 'xyz'.
${string/#substring/replacement}
Подстановка строки $replacement вместо $substring . Поиск ведется с начала строки $string .
${string/%substring/replacement}
Подстановка строки $replacement вместо $substring . Поиск ведется с конца строки $string .
stringZ=abcABC123ABCabc
echo ${stringZ/#abc/XYZ} # XYZABC123ABCabc
# Поиск ведется с начала строки
echo ${stringZ/%abc/XYZ} # abcABC123ABCXYZ
# Поиск ведется с конца строки
9.2.1. Использование awk при работе со строками
В качестве альтернативы, Bash-скрипты могут использовать средства awk при работе со строками.
Пример 9-12. Альтернативный способ извлечения подстрок
#!/bin/bash
# substring-extraction.sh
String=23skidoo1
# 012345678 Bash
# 123456789 awk
# Обратите внимание на различия в индексации:
# Bash начинает индексацию с '0'.
# Awk начинает индексацию с '1'.
echo ${String:2:4} # с 3 позиции (0-1-2), 4 символа
# skid
# В эквивалент в awk: substr(string,pos,length).
echo | awk '
{ print substr("'"${String}"'",3,4) # skid
}
'
# Передача пустого "echo" по каналу в awk, означает фиктивный ввод,
#+ делая, тем самым, ненужным предоставление имени файла.
exit 0
9.2.2. Дальнейшее обсуждение
Дополнительную информацию, по работе со строками, вы найдете в разделе Section 9.3 и в секции, посвященной команде expr. Примеры сценариев:
1. Пример 12-6
2. Пример 9-15
3. Пример 9-16
4. Пример 9-17
5. Пример 9-19
9.3. Подстановка параметров
Работа с переменными и/или подстановка их значений
${parameter}
То же самое, что и $parameter , т.е. значение переменной parameter . В отдельных случаях, при возникновении неоднозначности интерпретации, корректно будет работать только такая форма записи: ${parameter} .
Может использоваться для конкатенации (слияния) строковых переменных.
your_id=${USER}-on-${HOSTNAME}
echo "$your_id"
#
echo "Старый \$PATH = $PATH"
PATH=${PATH}:/opt/bin #Добавление /opt/bin в $PATH.
echo "Новый \$PATH = $PATH"
${parameter-default}, ${parameter:-default}
Если параметр отсутствует, то используется значение по-умолчанию.
echo ${username-`whoami`}
# Вывод результата работы команды `whoami`, если переменная $username не установлена.
Формы записи ${parameter-default} и ${parameter:-default} в большинстве случаев можно считать эквивалентными. Дополнительный символ : имеет значение только тогда, когда parameter определен, но имеет "пустое" (null) значение.
#!/bin/bash
username0=
# переменная username0 объявлена, но инициализирована "пустым" значением.
echo "username0 = ${username0-`whoami`}"
# Вывод после символа "=" отсутствует.
echo "username1 = ${username1-`whoami`}"
# Переменная username1 не была объявлена.
# Выводится имя пользователя, выданное командой `whoami`.
username2=
# переменная username2 объявлена, но инициализирована "пустым" значением.
echo "username2 = ${username2:-`whoami`}"
# Выводится имя пользователя, выданное командой `whoami`, поскольку
#+здесь употребляется конструкция ":-" , а не "-".
exit 0
Параметры по-умолчанию очень часто находят применение в случаях, когда сценарию необходимы какие либо входные аргументы, передаваемые из командной строки, но такие аргументы не были переданы.
Читать дальше