Короткий ответ? Оказывается, вы можете делать множество манипуляций с переменными, просто вставляя их, как если бы вы использовали $PWD
. Цитирование из справочника bash:
${parameter/pattern/string}
Шаблон расширяется, чтобы создать шаблон так же, как в расширении имени файла. Параметр раскрывается, и самое длинное совпадение шаблона с его значением заменяется на строку. Если шаблон начинается с ' /
', все совпадения шаблона заменяются строкой. Обычно заменяется только первый матч. Если шаблон начинается с « #
», он должен совпадать в начале расширенного значения параметра. Если шаблон начинается с « %
», он должен совпадать в конце расширенного значения параметра. Если строка пуста, совпадения с шаблоном удаляются, и /
следующий шаблон может быть опущен. Если параметр равен « @
» или « *
», операция замещения применяется к каждому позиционному параметру по очереди, и расширение является результирующим списком. Если параметр представляет собой переменную массива, подписанную с помощью « @
» или « *
», операция замещения применяется к каждому члену массива по очереди, и расширение является результирующим списком.
Итак, в этом примере: ${PWD/\/$upto\/*//$upto}
- параметр
PWD
.
- pattern это
/$upto/*
(это то, для чего нужны обратные слэши, чтобы избежать преждевременного завершения паттерна косыми чертами в паттерне и избежать включения поведения "заменить все совпадения", которое вы обычно получаете из паттерна , начинающегося с косая черта)
- Строка is
/$upto
Таким образом, он просматривает переменную $PWD
(которую оболочка поддерживает как текущий каталог), находит первую точку там, где есть имя каталога в $upto
окруженное косой чертой (так что установка $upto
в " dog
" не будет найдите каталог с именем " dogfood
") и замените это место и весь остальной текущий каталог просто на " /$upto
".