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/}
。
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 -
...これにより、最新バージョンに移動し、パス名を標準出力に印刷します。やり直すと、前の位置に戻ることができます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