Bashパラメーター拡張は、正確に一致する項目のみを置き換えます。

Bashパラメーター拡張は、正確に一致する項目のみを置き換えます。

''$ VARが何かと一致する場合にのみbashパラメータ拡張を使用して置き換えることはできますか?'value' 正確に

先頭を${VAR#value}削除し、同様に最後から削除する構文があります。これは で置き換えられますが、 or のようなものであれば で置き換えることができますが、そのような場合には同じに保たなければなりません。value$VAR${VAR%value}value''$VARvalue11value1

ステートメントを使用してこれを実行できることを知っていますが、特定の値と同じ場合は表示されないifものをステートメントに追加しようとしています。これがパラメータ拡張や他の種類の内部拡張を使用する理由です。PS1接続詞の構文。

答え1

次のパラメータ拡張を選択できます$()

PS1='$( [[ "${VAR}" == value ]] || printf %s "${VAR}" )$ '

値から末尾の改行文字を削除します$VAR

答え2

または、ksh93スタイルzshに切り替えるオプションが提供されている場合。${VAR:#value}${VAR/#%value}

${var/pattern[/replacement]}ksh93からbashにもコピーされました。 ksh93を使用すると、検索を開始${var/#pattern}または終了に固定できますが、${var/%pattern}両方を組み合わせることはできません。 bashも同じですが、zshも同じです${var/#%pattern}

バラよりinfo zsh 'Parameter Expansion'もっと学ぶ。

このextendedglobオプションを有効にすると、globパターン(#s)演算子(#e)ワイルドカードフラグ)はトピックのstart(regexのような^)とnd(regexのような)とそれぞれ一致するため、その後にorまたはを使用することもできます。e$set -o extendedlob${VAR/(#s)value(#e)}${VAR#value(#e)}${VAR%(#s)value}


プロンプト拡張に関するものであれば、フックprecmd(または$PROMPT_COMMANDbash)に含まれるテキストを次のように準備することをお勧めします。

prompt-from-VAR() {
  case $VAR in
    (value) psvar[1]=;;
    (something-else) psvar[1]=OTHER;;
    (*) psvar[1]=$VAR;;
  esac
}
autoload add-zsh-hook
add-zsh-hook precmd prompt-from-VAR
PS1='%1v$ '

(ここではより危険なオプションの代わりに$psvar使用されます)。%vprompsubst

Bashにはそれに対応するアイテムpsvarやフックはありませんprecmd

PROMPT_COMMAND="$PROMPT_COMMAND"'
  case $var in
    (value) promt_VAR=;;
    (something-else) prompt_VAR=OTHER;;
    (*) prompt_VAR=$VAR;;
  esac'
PS1='${prompt_VAR}$ '

関連情報