''
$ VARが何かと一致する場合にのみbashパラメータ拡張を使用して置き換えることはできますか?'value'
正確に?
先頭を${VAR#value}
削除し、同様に最後から削除する構文があります。これは で置き換えられますが、 or のようなものであれば で置き換えることができますが、そのような場合には同じに保たなければなりません。value
$VAR
${VAR%value}
value
''
$VAR
value1
1value
1
ステートメントを使用してこれを実行できることを知っていますが、特定の値と同じ場合は表示されない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)
(ワイルドカードフラグ)はトピックのs
tart(regexのような^
)とnd(regexのような)とそれぞれ一致するため、その後にorまたはを使用することもできます。e
$
set -o extendedlob
${VAR/(#s)value(#e)}
${VAR#value(#e)}
${VAR%(#s)value}
プロンプト拡張に関するものであれば、フックprecmd
(または$PROMPT_COMMAND
bash)に含まれるテキストを次のように準備することをお勧めします。
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
使用されます)。%v
prompsubst
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}$ '