我有一个问题,我想从bash
环境变量中去除前斜杠,如果变量根本没有设置,则同时给出默认值。我需要能够在可分配给变量的表达式中执行此操作。
在zsh
中,简单的解决方案是:
newvar=${${oldvar:-default}////}
但是我受到我正在使用的项目的限制 bash
.有没有一个表达式可以用来在bash
中复制上述赋值的右侧?
一些示例测试用例(oldvar → newvar(
- <未设置>未设置>→
"default"
-
"/"
→""
-
"hello world"
→"hello world"
-
"hello/world//!
" →"helloworld!"
你可以
这样做:
: ${oldvar:=default} ; newvar="${oldvar##*/}"
这仍然是两个独立的陈述,但相当简洁。 以下是他们所做的:
-
: ${oldvar:=default}
使用:
"noop",并将扩展作为参数,如果oldvar
为 null 或未设置,则会导致为其分配默认值(这就是:=
所做的(。 这不仅仅是扩展,还涉及(永久(任务。 -
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##*/}"
或类似的扩展,具体取决于您真正想要的内容。