내 Jenkins 환경 변수 $SVN_URL
는 입니다 . 쉘 스크립트를 통해 추출하여 변수에 저장하고 http://project/svn/neslrepo/trunk/java_project
싶습니다 .java_project
나는 시도했다:
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() 함수는 null로 끝나는 경로 이름 문자열을 디렉터리와 파일 이름 부분으로 나눕니다. 일반적인 상황에서 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