是否可以使用 bash 参数扩展来替换 $VAR 当''
且仅当它匹配某些'value'
确切地?
有一种语法${VAR#value}
可以删除value
开头$VAR
,也可以类似地${VAR%value}
从结尾删除它。这确实会替换value
为''
,但如果$VAR
是类似value1
或 的东西1value
,它可以将其替换为1
,但在这些情况下它应该保持不变。
我知道我可以用一条if
语句来做到这一点,但我试图向我的语句添加一些内容PS1
,如果它等于某个值则不会显示,这就是为什么我需要使用参数扩展或某种其他类型的内联语法。
答案1
我可能会选择这种参数扩展$()
:
PS1='$( [[ "${VAR}" == value ]] || printf %s "${VAR}" )$ '
请注意,它会从 的值中删除尾随换行符$VAR
。
答案2
如果zsh
可以选择切换到${VAR:#value}
或 ksh93 样式${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 ^
)和e
nd (如 regex ),因此在 后,您还可以使用or或。$
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
and%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}$ '