パラメータ拡張を使用して他の拡張の出力を変更する

パラメータ拡張を使用して他の拡張の出力を変更する

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 -

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

関連情報