젠킨스 쉘 스크립트

젠킨스 쉘 스크립트

내 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

관련 정보