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

时间:2017-02-03 19:58:43

标签: bash shell

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

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

newvar=${${oldvar:-default}//\//}

但我受到了我正在努力使用bash的项目的限制。我可以使用一个表达式来复制bash中上述作业的右侧吗?

一些示例测试用例( oldvar newvar

  • < not set> "default"
  • "/"""
  • "hello world""hello world"
  • "hello/world//!" →"helloworld!"

3 个答案:

答案 0 :(得分:5)

你可以这样做:

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

这仍然是两个单独的陈述,但非常简洁。以下是他们的所作所为:

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

答案 1 :(得分:1)

bash不允许嵌套替换。我同意Fred的解决方案(我不能发表评论),但我认为

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

最适合测试用例。

答案 2 :(得分:0)

您可以使用某个功能。

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##*/}"或类似的扩展,具体取决于您的真实需求。