스크립트 내에서 공백이 포함된 문자열을 명령줄 인수로 전달합니다.

스크립트 내에서 공백이 포함된 문자열을 명령줄 인수로 전달합니다.

Mac에서는 bash 쉘을 사용하고 있습니다.

실행할 수 있도록 쉘 스크립트 "gac"를 작성하고 싶습니다

> gac one two three

생산하다정확히달리는 것과 같은 효과

> git add .
> git commit -m "one two three"

지금까지 내 스크립트는 다음과 같습니다.

function gac() {
    git add .
    concatenated="'$*'"
    git commit -m "$concatenated"
}

쉘 매개변수를 공백으로 구분된 단일 문자열(스크립트의 두 번째 줄)로 연결하는 방법을 찾았습니다.여기. 위 스크립트는 로그 메시지 읽기를 제외하고 거의 작동합니다.

a382806 'one two three'

대신 쉘 스크립트를 사용할 때

a382806 one two three

수동으로 입력하면

> git commit -m "one two three"

명령줄에서.

어떤 아이디어가 있나요?

답변1

당신이 배치할 때큰따옴표확장, 그런매개변수 확장 $*, 확장된 텍스트는 다음의 영향을 받지 않습니다.분사. (이것이 확장 주위에 큰따옴표를 사용하는 이유 중 하나입니다 $. 또 다른 이유는 다음과 같습니다.와일드카드.) 또한 큰따옴표 안에는아포스트로피특별하게 취급되지 않으므로 참조를 수행하지 않으며,삭제됨.

그래서마이클 호머 라고, 그냥 해도 돼요거짓 ' '플래그를 생략하다귀하의 기능이 작동해야합니다. 다음과 같이 작성하는 것이 좋습니다.

gac() {
    git add .
    git commit -m "$*"
}

키워드를 사용하여 functionBash에서 함수를 정의할 수 있지만 위에 표시된 구문은 Bourne 스타일 셸 전체에서 동일하게 유효하고 이식 가능합니다.


여기에서 개념적 문제를 보다 직접적으로 해결하기 위해 원본 코드의 이 줄은 값에 공백이 포함된 매개 변수를 확장하여 이를 단일 매개 변수로 다음에 전달할 수 있음을 나타냅니다 git.

    concatenated="'$*'"

공백이 포함된 단일 인수를 직접 작성하는 경우 일반적으로 전체 문자열을 따옴표로 묶어 공백을 인용해야 합니다. 존재감' ' ~에" "줄에는 일반적으로 입력하는 따옴표를 포함하려고 한다는 의미입니다.

이 방법이 안되는 이유는셸 자체는 따옴표를 해석합니다. 일반적으로 셸에서 실행하는 명령에는 아무런 의미가 없습니다.. 다음 명령이 있다고 가정해 보겠습니다.

some-command 'foo bar' baz

이 명령은 실제로 명령에 따옴표를 전달하지 않습니다 some-command. 대신 다음 some-command과 같이 실행됩니다.foo bar토론1과 baz매개변수 2. (프로그램 실행 방법을 알려주는 인수 0도 있습니다. 쉘은 some-command이를 전달합니다.)

따옴표를 사용하면 다음을 수행할 수 있습니다.쉘에게 말해논쟁이 시작되고 끝나는 곳. 공백은 일반적으로 쉘에 각 측면의 텍스트를 별도의 인수로 처리하도록 지시합니다.1, 그러나 인용이 수행하는 것과 같은 쉘에 대한 공백의 특별한 의미를 억제하려고 합니다. inside ' 'inside 와 같이 따옴표가 인용되면 " "제거됩니다.그들의특별한 의미도 있습니다. 그런 다음 인용문을 실행하는 대신 git로그에 표시된 대로 문자 그대로 전달된 명령을 사용합니다.

a382806 'one two three'

1 쉘 작동 중, 공백 및 탭은 서로 관련되어 있지만 서로 다른 두 가지 방식으로 텍스트를 별도의 단어로 나눕니다. 첫 번째,명령이 처음으로 구문 분석될 때, 인용되지 않은 공백 및 탭은 어휘 태그를 구분합니다. 다른메타 문자이 작업도 수행할 수 있지만 추가 효과가 있습니다. 예를 들어 ;한 줄을 여러 명령으로 분할하는 것입니다. 2. 어디서매개변수 확장아니면 다른 어떤쉘 확장로 표현되는$2인용되지 않은 컨텍스트에서 실행되면 결과는 즉시 영향을 받습니다.분사, 어느문자를 $IFS구분 기호로 사용. 이것기본값IFS공백, 탭, 개행 문자가 차례로 옵니다.

2또는명령 대체, 구문 ` `대신 구문을 사용하는 경우에도 마찬가지입니다 $( ).

관련 정보