
Я создаю скрипт для удаления всех частей URL, кроме "domain.com". Мне удалось удалить большую часть, но у меня возникла проблема с подпапками. Вот мой код:
domain=$1
inp="${domain//http:'//'}"
inp="${inp//https:'//'}"
inp="${inp//www.}"
inp="${inp%/*}"
Проблема в том, что для каждой подпапки, которую я хочу отрезать, мне нужно создать еще одно правило "inp="${inp%/*}"". В настоящее время код там может отрезать только один уровень, поэтому он будет работать на "www.google.com/hello", но не на www.google.com/hello/there". Я мог бы добавить два правила, чтобы учесть это, но я не хочу повторять правило 20 раз, чтобы учесть все это.
Есть ли способ поместить это в цикл, который будет определять, когда это будет сделано, или есть лучший способ сделать это?
решение1
На месте
inp="${inp%/*}"
Пытаться:
inp="${inp%%/*}"
Оба эти замещения оболочки являются примерамиудаление суффикса. %
Форма удаляетсамый короткийсовпадающий суффикс. Напротив, %%
форма удаляетсамый длинныйсовпадающий суффикс. Так что, если вы хотите удалить первый /
и все после него, используйте %%/*
.
Документация
От man bash
:
${параметр%слово}
${параметр%%слово}
Удалить соответствующий шаблон суффикса. Слово расширяется для создания шаблона, как и при расширении имени пути. Если шаблон соответствует завершающей части расширенного значения параметра, то результатом расширения является расширенное значение параметра с удаленным самым коротким совпадающим шаблоном (регистр%
) или самым длинным совпадающим шаблоном (регистр%%
). Если параметр равен @ или *, операция удаления шаблона применяется к каждому позиционному параметру по очереди, а расширение представляет собой результирующий список. Если параметр является переменной массива, индексированной @ или *, операция удаления шаблона применяется к каждому члену массива по очереди, а расширение представляет собой результирующий список.