使用參數擴展來修改另一個擴展的輸出

使用參數擴展來修改另一個擴展的輸出

我正在嘗試使用 Bash 參數擴展來修改命令替換或其他參數擴展的輸出。

以下嵌套擴充功能在 Zsh 中運作良好;但會導致 Bash 中出現「錯誤替換」錯誤:

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

或者

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

輸出應該是 的最後一個資料夾$PWD,替換為latest當我的當前目錄是trunk

所以/home/user/trunk應該成為latest

是否有 Bash 等效項允許在不依賴變數或管道的情況下進行鍊式擴展?或者 Bash 擴充只允許輸入是字串或普通變數?

答案1

不,替換運算子的巢狀是zsh.

注意,用zshlike with (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

我沒有看到滿足您要求的方法。如果你想用最新的替換所有$PWD- 儘管最好的方法是cd最新的。

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

...這將帶您到最新版本並將路徑名稱列印到標準輸出。你可以透過再做一次來回到原來的地方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

相關內容