如何在bash脚本和Ansible中从JDK下载链接提取文件名并解决报错
问题原因说明
- Bash下
expr提取失败的原因:你写的正则表达式匹配规则错误,.[jdk]*只能匹配任意单个字符后接0个或多个j、d、k字符,无法匹配完整的jdk文件名前缀。 - Ansible模板报错的原因:你混淆了Bash参数扩展语法和Ansible的Jinja2模板语法,
##*/是Bash的语法,不能直接写在Jinja2的变量插值标记{{ }}内部,同时你多写了一层大括号(三个连续的{)也违反了Jinja2的语法规则,因此触发了字符非法报错。
纯Bash环境提取文件名方案
- 方法1:使用Bash内置参数扩展(推荐,性能最高)
直接执行即可获取文件名:
后续解压直接调用:filename=${javaurl##*/}tar -xzvf "$filename" - 方法2:使用专门的
basename命令filename=$(basename "$javaurl")
Ansible任务修复方案
有两种可行写法,推荐第二种符合Ansible最佳实践的写法:
写法1:在Shell层处理文件名
把文件名提取逻辑放在Bash执行上下文,不混入Jinja2语法:
- name: Download Java to Latest Version shell: | mkdir -p /opt/java cd /opt/java wget -c --header "Cookie: oraclelicense=accept-securebackup-cookie" {{javaurl}} tar -xzvf "$(basename {{javaurl}})"
写法2:用Jinja2过滤器在Ansible层处理文件名(推荐)
直接使用Jinja2内置的basename过滤器解析文件名,不依赖Shell命令:
- name: Download Java to Latest Version shell: | mkdir -p /opt/java cd /opt/java wget -c --header "Cookie: oraclelicense=accept-securebackup-cookie" {{javaurl}} tar -xzvf "{{ javaurl | basename }}"
内容的提问来源于stack exchange,提问作者Rajarshi Das
相关产品推荐
相关产品推荐

