我有一个问题,我想从bash
环境变量中删除前斜线,并且同时给出一个默认值,如果该变量根本没有设置的话。我需要能够在可赋值给变量的表达式中执行此操作。
在zsh
中,简单的解决方案是:
newvar=${${oldvar:-default}//\//}
但我受到了我正在努力使用bash
的项目的限制。我可以使用一个表达式来复制bash
中上述作业的右侧吗?
一些示例测试用例( oldvar → newvar )
"default"
"/"
→""
"hello world"
→"hello world"
"hello/world//!
" →"helloworld!"
答案 0 :(得分:5)
你可以这样做:
: ${oldvar:=default} ; newvar="${oldvar##*/}"
这仍然是两个单独的陈述,但非常简洁。以下是他们的所作所为:
: ${oldvar:=default}
使用:
“noop”并作为参数提供一个扩展,如果它为null或未设置,则会为oldvar
分配一个默认值(这就是{ {1}}确实)。这不仅仅是一次扩展,还涉及(永久)任务。:=
从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##*/}"
或类似的扩展,具体取决于您的真实需求。