매개변수 확장을 사용하여 다른 확장의 출력 수정

매개변수 확장을 사용하여 다른 확장의 출력 수정

Bash 매개변수 확장을 사용하여 명령 대체 또는 다른 매개변수 확장의 출력을 수정하려고 합니다.

다음 중첩 확장은 Zsh에서 매우 잘 작동합니다. 그러나 Bash에서는 "잘못된 대체" 오류가 발생합니다.

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

또는

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

출력은 의 마지막 폴더여야 하며 , 현재 디렉터리가 다음과 같을 때로 $PWD대체되어야 합니다.latesttrunk

그렇게 /home/user/trunk되어야 한다latest

변수나 파이프에 의존하지 않고 체인 확장을 허용하는 Bash와 동등한 기능이 있습니까? 아니면 Bash 확장에서는 입력이 문자열이나 일반 변수만 허용됩니까?

답변1

아니요, 대체 연산자의 중첩은 에 고유합니다 zsh.

zshlike with 를 사용하면 을 (t)csh수행할 수도 있습니다 ${PWD:t:s/trunk/latest/}.

기록 확장을 위해 csh 기록 수정자를 지원 하지만 bash매개변수 확장을 위해서는 지원하지 않습니다.

여기서는 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

귀하의 요청에 대한 방법을 찾을 수 없습니다. 최신 버전 으로 모두 교체하려는 경우 $PWD가장 좋은 방법은 cd최신 버전으로 교체하는 것입니다.

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

...최신 버전으로 이동하고 경로 이름을 stdout으로 인쇄합니다. 다시 수행하면 원래 있던 곳으로 바로 돌아갈 수 있습니다 cd -. 다음과 같이 동일한 작업을 수행할 수 있습니다 $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

관련 정보