我的詹金斯环境变量$SVN_URL
是http://project/svn/neslrepo/trunk/java_project
.我想java_project
通过 shell 脚本提取并存储在变量中。
我试过:
job_name=(echo $SVN_URL | awk -F "/" '{print $NF}')
echo $job_name.war
我预计输出是java_project.war
,但它不起作用。我究竟做错了什么?
答案1
贝壳已经提供一些不错的工具可以做到这一点,不需要外部命令:
$ SVN_URL="http://project/svn/neslrepo/trunk/java_project"
$ echo ${SVN_URL##*/}
java_project
所以你需要的是:
job_name=${SVN_URL##*/}.war
答案2
basename
尽管参数是 HTTP URL 而不是文件系统路径,但似乎也可以做到这一点。
echo $(basename "http://project/svn/neslrepo/trunk/java_project/").war
java_project.war
由于手册页没有提及 HTTP URL,这可能是对basename
.这似乎是 HTTP URL 和文件系统路径之间结构相似性的副作用。man 3 basename
说(强调我的):
函数 dirname() 和 basename() 将空终止的路径名字符串分解为目录和文件名部分。在通常情况下,dirname() 返回字符串直到但不包括最后的“/”,并且basename() 返回最后一个“/”之后的组件。尾随“/”字符不计为路径名的一部分。
答案3
我尝试了以下两种方法,效果很好
Method1
@praveen_linux_example ~]# SVN_URL=http://project/svn/neslrepo/trunk/java_project
[root@praveen_linux_example ~]# jobname=`echo $SVN_URL| awk -F "/" '{print $NF}'`
[root@praveen_linux_example ~]# echo $jobname.war
java_project.war
======================================================================================================
Method 2
SVN_URL=http://project/svn/neslrepo/trunk/java_project
@praveen_linux_example ~]# echo $SVN_URL| sed "s/.*\///"| sed "s/$/.war/"
java_project.war
答案4
问题出在你的job_name=(echo $SVN_URL | awk -F "/" '{print $NF}')
线路上。
您正在尝试使用命令替换但是,您已经忘记了$
。
为了使 bash 执行括号中的命令,应该如下所示:
job_name=$(echo $SVN_URL | awk -F "/" '{print $NF}')
以下代码片段非常适合我:
#!/bin/bash
SVN_URL="http://project/svn/neslrepo/trunk/java_project"
job_name=$(echo $SVN_URL | awk -F '/' '{print $NF}')
echo $job_name.war