Используйте расширение параметра для изменения вывода другого расширения

Используйте расширение параметра для изменения вывода другого расширения

Я пытаюсь использовать расширения параметров Bash для изменения вывода подстановки команды или другого расширения параметра.

Следующие вложенные расширения работают достаточно хорошо в Zsh, но приводят к ошибке «плохой подстановки» в Bash:

${${PWD##*/}//trunk/latest}

или

${$(basename $PWD)//trunk/latest}

вывод должен быть последней папкой $PWD, замененной на , latestкогда мой текущий каталогtrunk

так /home/user/trunkдолжно статьlatest

Есть ли эквивалент Bash, позволяющий объединять расширения без использования переменных или каналов? Или расширения Bash допускают только ввод строки или простой переменной?

решение1

Нет, такое вложение операторов подстановки уникально для zsh.

Обратите внимание, что с помощью , zshкак и с (t)csh, вы также можете сделать ${PWD:t:s/trunk/latest/}.

Хотя он bashтакже поддерживает модификаторы истории csh для расширения истории, он не поддерживает их для расширения параметров.

Здесь с помощью bashиспользуйте временную переменную:

var=${PWD##*/} var=${var//trunk/latest}

решение2

Попробуйте это с bash:

[[ $PWD =~ .*/(.*) ]] && echo "${BASH_REMATCH[1]//trunk/latest}"

или одной командой:

[[ $PWD =~ .*/(.*) && ${BASH_REMATCH[1]//trunk/latest} =~ (.*) ]]

Результат в${BASH_REMATCH[1]}

решение3

Вы хотите...?

PWD=latest

Я не вижу метода для вашего запроса. Если вы хотите заменить все $PWDw/ latest - хотя лучший способ сделать это - to cdlatest.

[ /home/user/trunk = "$PWD" ] && OLDPWD=../latest cd -

...что перенесет вас к latest и выведет имя пути на stdout. Вы можете вернуться туда, откуда пришли, выполнив команду cd -again. Вы можете сделать то же самое с помощью $CDPATH:

mkdir -p /tmp/{1..5}  ; \
CDPATH=/tmp cd 3; cd -; \
echo "${CDPATH:-empty or unset::}" "$OLDPWD"

/tmp/3
/home/mikeserv
empty or unset:: /tmp/3

Связанный контент