bash 是否同时支持正则表达式替换 + 默认值



我有一个问题,我想从bash环境变量中去除前斜杠如果变量根本没有设置,则同时给出默认值。我需要能够在可分配给变量的表达式中执行此操作。

zsh中,简单的解决方案是:

newvar=${${oldvar:-default}////}
但是我受到

我正在使用的项目的限制 bash .有没有一个表达式可以用来在bash中复制上述赋值的右侧?


一些示例测试用例(oldvarnewvar(

  • <未设置>"default"
  • "/"""
  • "hello world""hello world"
  • "hello/world//! " → "helloworld!"
你可以

这样做:

: ${oldvar:=default} ; newvar="${oldvar##*/}"

这仍然是两个独立的陈述,但相当简洁。 以下是他们所做的:

  1. : ${oldvar:=default}使用:"noop",并将扩展作为参数,如果oldvar为 null 或未设置,则会导致为其分配默认值(这就是:=所做的(。 这不仅仅是扩展,还涉及(永久(任务。
  2. newvar="${oldvar##*/}"oldvar 的值中删除所有前导斜杠,然后将结果值分配给 newvar 。 这样做是因为##匹配从 oldvar 值开头开始的最长时间,并与以下模式匹配 */ ,这意味着任何以斜杠结尾的零个或多个字符的序列。

bash 不允许嵌套替换。 我同意弗雷德的解决方案(我无法评论它(,但我认为

: ${oldvar:=default} ; newvar="${oldvar////}"

最适合测试用例。

您可以使用函数。

function sanitize () {
   local v="${1:-default}"
   echo "${v////}"
}
newvar="$(sanitize "$oldvar")"

或者

function sanitize () {
   local v="${!$1}"
   : ${v:=default}
   echo "${v////}"
}
newvar="$(sanitize oldvar)"

您可以将"${v////}"替换为"${v##*/}"或类似的扩展,具体取决于您真正想要的内容。

最新更新