BashЯзык командного интерпретатора bash. Part 6. «Условная подстановка параметров»

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

${параметр-строка}, ${параметр:-строка}

Логика конструкции: если параметр отсутствует, используется указанная строка, если непустое – значение по умолчанию.
Обе формы записи можно считать равнозначными в большинстве случаев. Символ ":" имеет значение когда параметр инициализирован, но имеет пустое значение. Приведу пару примеров для разъяснения ситуации:
param1=
echo ${param1-"Hello"}
Вывода не будет произведено, так как param1 инициализирован, но имеет пустое значение.

echo ${param2-"Hello"}
Будет выведена указанная строка, так как параметр не был инициализирован.

param2=
echo ${param2:-"Hello"}
Будет выведена указанная строка, так как параметр был инициализирован пустым значением, но использовалась конструкция ":-".

${параметр=строка}, ${параметр:=строка}

Логика конструкции: если параметр имеет пустое значение или не инициализирован, то ему присваивается указанное значение, после чего оно подставляется. Символ ":" имеет значение когда параметр инициализирован. Разберём на примерах:
param3=
echo ${param3="Hello"}
Так как параметр не инициализирован, он не будет выведен.

echo ${param4:="Hello"}
Будет выведена указанная строка, так как param4 не инициализирован.

param5="param"
echo ${param:="Hello"}
Будет выведено первоначальное значение параметра.

${параметр+строка}, ${параметр:+строка }

Логика конструкции: если параметр имеет значение, то используется оно, в противном случае – альтернативная строка. Различия конструкций разберём на примерах:
echo ${param6+"Hello"}
Ничего не выводится.

param7=
echo ${param6+"Hello"}
Будет выведена указанная строка.

param8=123
echo ${param8+"Hello"}
Будет выведена указанная строка.

echo ${param9:+"Hello"}
Ничего не выводится.

param10=
echo ${param10:+"Hello"}
Ничего не выводится.

param11=123
echo ${param11:+"Hello"}
Будет выведена указанная строка.

${параметр? сообщение}, ${параметр:? сообщение}

Логика конструкции: если параметр инициализирован, используется его значение; если параметр не инициализирован – выводится сообщение.
echo ${param12?"hello"}
Выводится сообщение.

echo ${param12:?"hello"}
Выводится сообщение.

param13=
echo ${param13?"hello"}
Не выводится ничего (выводится пустое значение).

param14=123
echo ${param14:?"hello"}
Выводится значение параметра.

${#параметр}

Логика конструкции: возвращается длина значения параметра в байтах. В случае массивов, команда ${#array} возвращает длину первого элемента массива.
Исключения:
1) ${#*} и ${#@} возвращает количество аргументов (позиционных параметров).
2) Для массивов, ${#array[*]} и ${#array[@]} возвращает количество элементов в массиве.
param15=123
echo ${#param15}
Будет выведена длина значения параметра (в данном случае 3).

${параметр#шаблон}, ${параметр##шаблон}

Логика конструкции: удаляет из параметра наименьшую (наибольшую) подстроку, удовлетворяющую указанному шаблону, начиная из головной части значения параметра.
Пример:
param16=12345
echo ${param16#123}
Будет выведено 45.

$ echo $PWD
/home/istergul/fold
$ echo ${PWD##*/}
fold


${var%Pattern}, ${var%%Pattern}

Логика конструкции: удаляет из параметра наименьшую (наибольшую) подстроку, удовлетворяющую указанному шаблону, начиная из хвостовой части значения параметра. По сути данная конструкция повторяет предыдущую, только начиная с конца значения параметра.

Комментарии (6)

  • avatar
  • Dez
  • 14 июля 2009, 23:05
  • #
  • 1
Спасибо за статью. В предыдущих топиках ты писал о том, что будет в следующих постах. Было бы весьма интересно узнать, чего нам ожидать?
В следующем топике будет рассказано о функциях в bash. Спасибо, что напомнил это сообщить.
  • avatar
  • Dez
  • 14 июля 2009, 23:10
  • #
  • 1
Надеюсь, следующий пост будет таким же информативным. Благодаря твоему циклу статей я решил расширить познания в bash.
Спасибо. Рад, что сделал доброе дело :)
Немного моего соуса в блюдо Istergul'а:

Пример 1
Часто мои скрипты начинаются с такой строчки:
Dir=${1-.}
То есть скрипт запускается и в качестве параметра ему указывается директория, которую надо обработать. Если директория не указана, то обрабатывается текущая директория.

Пример 2
Для начала задам переменную
Pic=/usr/share/wallpapers/Wolf.jpg
Вывод без первых трех символов(любых)
echo ${Pic#???}
r/share/wallpapers/Wolf.jpg


Пример 3
Для той же переменной
Pic=/usr/share/wallpapers/Wolf.jpg
Вывод с пятого по 9ый символы (то есть пропустить от начала 4ре символа и напечатать следующие 5)
echo ${Pic:4:5}
/shar


Пример 4
Переименование всех jpg-файлов в текущей папке под общий шаблон: Image_число.jpg
N=10000; for i in *.jpg;do let N=N+1; mv -i "$i" Image_${N:1}.jpg;done
Работает для не более 9999 файлов в текущей директории

Пример 5
Pic=/usr/share/wallpapers/Wolf.jpg
Перейти в папку содержащую эту картинку
cd ${Pic%/*}
это соответствует
cd /usr/share/wallpapers


Пример 6
Если файл картинка(jpg), то просмотеть ей (например, при помощи програмки eog)
[ "${Pic##*.}" = jpg ] && eog $Pic
Огромное спасибо за ваши дополнения.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.