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

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

Bash パラメータ拡張を使用して、コマンド置換または別のパラメータ拡張の出力を変更しようとしています。

次のネストされた展開は Zsh では非常にうまく機能しますが、Bash では「不正な置換」エラーが発生します。

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

または

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

出力は$PWDlatest現在のディレクトリがtrunk

そう/home/user/trunkなるべきだlatest

変数やパイプに頼らずにチェーン展開を可能にする Bash の同等のものはありますか? それとも、Bash の展開では入力として文字列または単純な変数のみが許可されますか?

答え1

いいえ、置換演算子のネストは に固有ですzsh

zshと同様に(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}"

または 1 つのコマンドで:

[[ $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

関連情報