Use a expansão de parâmetros para modificar a saída de outra expansão

Use a expansão de parâmetros para modificar a saída de outra expansão

Estou tentando usar as expansões de parâmetro Bash para modificar a saída de uma substituição de comando ou outra expansão de parâmetro.

As seguintes expansões aninhadas funcionam muito bem no Zsh; mas resulta em um erro de "substituição incorreta" no Bash:

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

ou

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

a saída deve ser a última pasta do $PWD, substituída por latestquando meu diretório atual fortrunk

assim /home/user/trunkdeveria se tornarlatest

Existe um equivalente do Bash que permite encadear expansões sem depender de variáveis ​​​​ou pipes? Ou as expansões do Bash permitem apenas que a entrada seja uma string ou uma variável simples?

Responder1

Não, esse aninhamento de operadores de substituição é exclusivo dezsh .

Observe que com zshlike with (t)csh, você também pode fazer${PWD:t:s/trunk/latest/} .

No entantobash também suporte esses modificadores de histórico csh para expansão de histórico, ele não os suporta para suas expansões de parâmetros.

Aqui com bash, use uma variável temporária:

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

Responder2

Tente isso com o bash:

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

ou com um comando:

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

O resultado está em${BASH_REMATCH[1]}

Responder3

você quer...?

PWD=latest

Não vejo um método para sua solicitação. Se você deseja substituir todos os $PWDmais recentes - embora a melhor maneira de fazer isso seja cdo mais recente.

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

... que o levará ao mais recente e imprimirá o nome do caminho para stdout. Você pode voltar de onde veio fazendo cd -novamente. Você pode fazer o mesmo com $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

informação relacionada