2014-10-28 3 views
0

필자가 쓰고있는 쉘 스크립트에 bash 함수에 문제가있다. 함수는 다음과 같습니다bash : 함수 인자 확장하기

do_command() { 
    if [[ $DRY_RUN ]]; then 
    echo [email protected] 
    else 
    [email protected] 
    fi 
} 

함수는 간단하다 DRY_RUN 플래그가 설정되어 있다면 우리가 그렇지 않으면 실행되는 인쇄 방법. 이것은 내가 등의 다른 버전을 시도 자식 태그 명령을 제외한 대부분의 명령에 대해 잘 작동 : 실제로 태그 명령을 실행

do_command git tag -a $NEW_VERSION -m '$INPUT_COMMENT' 

을하지만, $ INPUT_COMMENT

내가이 다른 시도 주석 줄 올바른 에코 출력을 제공하지만 git tag 명령을 실행할 수없는 버전.

do_command git tag -a $NEW_VERSION -m "$INPUT_COMMENT" 

do_command git tag -a $NEW_VERSION -m "\"$INPUT_COMMENT\"" 

이 호출의 일부가 모두 에코 만드는 방법과 자식 명령 일이 있습니까? 아니면 do_command 버전에서 구문 분석해야합니까?

+1

BTW, http://shellcheck.net/ 인간의 검토를 호출 할 필요없이이 일을 잡은 것이다. –

+0

(다른 이름으로는 대문자로 된 이름은 쉘 내장 변수와 환경 변수에 일반적으로 사용되는 이름이지만 일반적으로 내 보낸 적이없는 변수에는 사용하지 않는 것이 좋지 않습니다. 다른 범주의 변수를 실수로 덮어 쓸 수 있음을 의미합니다). –

+1

'do_command'와 같은 명령은 간단한 명령에서만 작동한다는 점에 유의하십시오. 파이프가없고,'&&'/'||'리스트가없고, I/O 리다이렉션도없고 복잡한 명령도 없다 : 명령 이름과 그 인수를 초월한 구문을 필요로하는 것은 아무것도 없다. – chepner

답변

4

인용 부호가있는 "[email protected]"을 사용하면 공백이있는 인수를 올바르게 처리 할 수 ​​있습니다. [email protected]이라고 쓰면 $INPUT_COMMENT에 공백이있는 경우 git 명령이 작동하지 않습니다.

do_command() { 
    if [[ $DRY_RUN ]]; then 
    echo "[email protected]" 
    else 
    "[email protected]" 
    fi 
} 

사용법 :

do_command git tag -a $NEW_VERSION -m "$INPUT_COMMENT" 
+0

고맙습니다, 잘못된 방향으로 보았습니다 – Andreas

+3

'printf '% q' "$ @"; DRY_RUN 경우 대신 에코'; 그런 식으로 결과는 foo bar "baz"와 "foo bar baz"를 시각적으로 구별합니다. –

+1

필자는 변수의 _every_ 사용에 대해 큰 따옴표를 사용하는 것을 권유합니다 (값에 공백이 있음을 명시 적으로 나타내지 않는 한). 따라서 "$ DRY_RUN"및 "$ NEW_VERSION"도 사용하십시오. 'DRY_RUN'이''true ''또는''false "'이면''$ DRY_RUN' '을 쓰면됩니다. 그때'. 더 읽기 쉽게 만듭니다. – Alfe