2012-11-19 2 views
1

, 나는 형태의 커밋의 목록을사용 bash는 스크립트 명령에서 배열 데이터를 캡처

+ 95b117c39869a810595f1e169c64e728d2d7443d 
+ e126f1b996ecf1d2a8cf744c74daa92cce338123 
+ 869169a6cb0bbe8f1922838798580a1e74ec3884 
+ 667819b617c88bd886dc2001f612b5c7a4d396c3 
+ fd41328a84b0a127affa6fe4328c93e933de378c 
+ cfe1807e5d4acc6b5e75f4463dadb3b1c957376f 

좋은 소식입니다.

지금 떠들썩한 파티 스크립트 내에서이 명령을 실행하고 다음 코드를 사용하여 배열로 출력을 캡처 할

:

commit_hashes=(`git cherry origin/Dev`) 
echo ${commit_hashes[@]} 

다음과 같은 출력 산출 :

+ 95b117c39869a810595f1e169c64e728d2d7443d + e126f1b996ecf1d2a8cf744c74daa92cce338123 + 869169a6cb0bbe8f1922838798580a1e74ec3884 + 667819b617c88bd886dc2001f612b5c7a4d396c3 + fd41328a84b0a127affa6fe432 
8c93e933de378c + cfe1807e5d4acc6b5e75f4463dadb3b1c957376f 

이것은이다 좋은 일이 아니다.

커밋 목록을 사용하기 전에 먼저 분해해야하는 문자열로 반환된다. 일부 검색 후에 데이터 캡쳐 전에 스크립트에 IFS=""을 추가하면 문제가 해결된다는 것을 알았습니다.

그래서 나는이 완전히 현실의 감각을 종료 출력

+ 95b117c39869a810595f1e169c64e728d2d7443d 
+ e126f1b996ecf1d2a8cf744c74daa92cce338123 
+ 869169a6cb0bbe8f1922838798580a1e74ec3884 
+ 667819b617c88bd886dc2001f612b5c7a4d396c3 
+ fd41328a84b0a127affa6fe4328c93e933de378c 
+ cfe1807e5d4acc6b5e75f4463dadb3b1c957376f 

IFS="" 
commit_hashes=(`git cherry origin/Dev`) 
echo ${commit_hashes[@]} 

를 읽어 내 코드를 편집했다.

내가하고있는 일이 왜하고 있는지 알고 싶습니다. 그래서 더 많은 검색을 한 후 이걸 Internal Field Separator이라고 부르며 유닉스 시스템에서 명령 해석기로 패턴을 손상시킬 위치를 파악하는 데 사용됩니다 토큰.

본인은 알고 있습니다. 빈 문자열이 변수를 설정 그것은 제정신 방식으로 내 배열 데이터를 처리 할 수 ​​왜 이해가 안 무엇

  1. 입니다.
  2. 처음에는 왜 그것을 설정해야했는지, 해석기 대신 배열 데이터를 처리하고 적절하게 처리해야했는지 확인해야합니다.
  3. 내부 필드 구분 기호를 빈 문자열로 설정하면 기본적으로 공백, 탭 및 개행 문자를 포함하므로 사물의 웅장한 구성이 적용됩니다.

이러한 세 가지 문제를 해결하기위한 몇 가지 도움을 주시면 감사하겠습니다.

답변

2

man bash/Arrays을 참조하십시오. 배열에 문제가 없습니다. 당신이 할 때

echo ${commit_hashes[@]} 

echo는 한 줄에 모든 배열 요소를 보여줍니다. 당신이 할말

for i in `seq 10`; do 
    echo ${commit_hashes[$i]} 
done 

당신은 한 줄당 하나의 항목이 표시됩니다 볼 수 있습니다.

그러나 IFS=을 빈 문자열로 설정하면 git cherry의 결과가 여러 값으로 분리되지 않습니다. 개행을 포함한 캐릭터 라인 전체가 최초의 배열 요소에 할당 할 수 있습니다. 만약 당신이 두 번째 경우에

echo ${commit_hashes[0]} 

이면, 그 에코는 모든 출력 라인을 보여줍니다.