20 июл. 2000 г.

Язык bash часть 7

Язык командного интерпретатора 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}

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


=========================Добавление из комментов================
Пример 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