Bash 参数扩展仅替换精确匹配

Bash 参数扩展仅替换精确匹配

是否可以使用 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)(通配标志) 分别匹配主题的start (如 regex ^)和end (如 regex ),因此在 后,您还可以使用or或。$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$ '

(这里使用$psvarand%v而不是更危险的prompsubst选项)。

在 bash 中没有等效项psvarprecmd钩子:

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

相关内容