
我正在嘗試使用 Bash 參數擴展來修改命令替換或其他參數擴展的輸出。
以下嵌套擴充功能在 Zsh 中運作良好;但會導致 Bash 中出現「錯誤替換」錯誤:
${${PWD##*/}//trunk/latest}
或者
${$(basename $PWD)//trunk/latest}
輸出應該是 的最後一個資料夾$PWD
,替換為latest
當我的當前目錄是trunk
所以/home/user/trunk
應該成為latest
是否有 Bash 等效項允許在不依賴變數或管道的情況下進行鍊式擴展?或者 Bash 擴充只允許輸入是字串或普通變數?
答案1
不,替換運算子的巢狀是zsh
.
注意,用zsh
like 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