Вы должны быть осторожны при использовании шаблонов при подстановке параметров.Эти шаблоны являются не регулярными выражениями, а шаблонами расширения пути или шаблоном глобуса.
Идея состоит в том, чтобы удалить последнее число, поэтому вы хотите использовать Удалить соответствующий шаблон суффикса (${parameter%%word}
).Здесь мы удаляем самый длинный экземпляр сопоставленного шаблона, описанного word
.Представление однозначных чисел легко сделать с помощью шаблона [0-9]
, однако многозначные числа сложнее.Для этого вам нужно использовать расширенные выражения glob:
*(pattern-list)
: Соответствует нулю или более вхождений данных шаблонов
Так что если выЧтобы удалить последний номер, вы используете:
$ shopt -s extglob
$ disk="/dev/sda1"
$ echo "${disk#${disk%%*([0-9])}} "${disk%%*([0-9])}"
1 dev/sda
$ disk="/dev/dsk/c0t2d0s0"
$ echo "${disk#${disk%%*([0-9])}} "${disk%%*([0-9])}"
0 /dev/dsk/c0t2d0s
Мы должны использовать ${disk#${disk%%*([0-9])}}
, чтобы удалить префикс.По сути, он ищет последний номер, удаляет его, использует остаток и снова удаляет эту часть.
Вы также можете использовать замену шаблона (${parameter/pattern/string}
) с якорями %
и #
для привязки шаблона к началу или концу параметра.(см. man bash
для получения дополнительной информации).Это полностью эквивалентно предыдущему решению:
$ shopt -s extglob
$ disk="/dev/sda1"
$ echo "${disk/${disk/%*([0-9])}/}" "${disk/%*([0-9])}"
1 dev/sda
$ disk="/dev/dsk/c0t2d0s0"
$ echo "${disk/${disk/%*([0-9])}/}" "${disk/%*([0-9])}"
0 /dev/dsk/c0t2d0s