bash의 $() (및 for 루프) 이해 [중복]

bash의 $() (및 for 루프) 이해 [중복]

git이 포함된 디렉토리가 있고 git branch다음과 같은 출력이 제공됩니다.

$ git branch
  branch1
* branch2
  master

*현재 지점에 태그를 지정합니다 . 이 출력을 스크립트에서 사용하고 싶습니다. 그래서 다음과 같은 줄을 반복합니다.

$ for line in $(git branch); do echo "${line}"; done;
branch1
README.txt
branch2
master

질문:

무슨 일이에요 *? 왜 README.txt[1] 이 표시되나요 ?

git branch공백을 사용하여 법선에서 반환된 줄을 있는 그대로 반복하려면 어떻게 해야 합니까 *?

추신: 저는 지금 Mac을 사용하고 있습니다.

[1] (또는 저장소의 다른 파일이지만 "README.txt" 파일은 하나만 있음)

답변1

$(git branch)루프를 풀어 for루프를 반복 하면 여러 줄 문자열로 확장됩니다.

  branch1
* branch2
  master

명령 대체는 따옴표가 없기 때문에 공백, 탭 및 줄 바꿈(기본적으로)을 기준으로 4개의 단어로 분할됩니다.

branch1 * branch2 master

그런 다음 각 단어는 파일 이름(와일드카드)을 생성합니다. 두 번째 단어는 *현재 디렉터리의 모든(숨겨지지 않은) 파일 이름으로 대체됩니다. 이는 귀하의 경우 파일 이름인 README.txt.

따라서 루프가 반복할 최종 목록은 다음과 같습니다.

branch1 README.txt branch2 master

반대로, 스크립트로 출력하고 싶다면 다음을 사용하세요.

git branch

다른 작업을 수행할 필요가 없습니다.

출력을 변수에 저장하려면 다음을 사용하십시오.

branches=$( git branch )

그 사람의 이름을 알고 싶나요?현재의그런 다음 이름 앞에 다음이 오는 분기를 추출합니다 *.

curr_branch=$( git branch | awk '/^\*/ { print $2 }' )

반복의 출력을 원하면 루프를 git branch사용하십시오 .while

git branch |
while read -r star name; do
    if [ -z "$name" ]; then
        name=$star
        printf 'One branch is "%s"\n' "$name"
    else
        printf 'The current branch is "%s"\n' "$name"
    fi
done

git branch --show-current를 사용하여 현재 분기의 이름을 직접 가져올 수도 있습니다 .

관련 정보