Bash에서 elif, else 문이 있으면


358

다음 if문과 관련된 문제가 elif및 에 관한 문제를 해결할 수없는 것 같습니다 then. printf아직 개발 중이므로 명언에서 아직 테스트 할 수 없었으므로 잘못되었을 가능성이 있습니다.

내가 얻는 오류는 다음과 같습니다.

./timezone_string.sh: line 14: syntax error near unexpected token `then'
./timezone_string.sh: line 14: `then'

그리고 그 진술은 그렇습니다.

if [ "$seconds" -eq 0 ];then
   $timezone_string="Z"
elif[ "$seconds" -gt 0 ]
then
   $timezone_string=`printf "%02d:%02d" $seconds/3600 ($seconds/60)%60`
else
   echo "Unknown parameter"
fi

7
우리가 왜 궁금 해야 할then 에 문을 if하고 elif있지만에서 else, 또한 일반적이다.

@ w17t는 시퀀스와 조건을 분리해야하기 때문입니다.
Sasha

3
@codeforester 난 단지 5K가 그 하나에 중복으로 500K보기 질문 마킹에 많은 로직을 볼 수 없습니다
'SO 정지 해치지'fedorqui

일부 코드 자동 서식 도구를 사용하면 대괄호 주위에 공백을 자동으로 추가 / 제거하면 도움이 될 수 있습니다. 편집 기용 플러그인을 검색 할 수 있습니다.
Nj

답변:


453

elif와 사이에 공백이 없습니다 [.

elif[ "$seconds" -gt 0 ]

해야한다

elif [ "$seconds" -gt 0 ]

이 질문이 많은 견해를 얻고 있음을 알 때 따라야 할 구문은 다음과 같습니다.

if [ conditions ]
# ^ ^          ^

괄호 주위에 공백이 필요하다는 의미입니다 . 그렇지 않으면 작동하지 않습니다. [그 자체 명령 이기 때문 입니다.

이 같은보고되지 않은 이유 elif[: command not found(유사한 또는)보고 후 것입니다 if그리고 then, 쉘이 중 하나를 찾고 elif, else또는 fi. 그러나 다른 then형식을 찾습니다 (잘못된 형식의 elif[). 명령문을 구문 분석 한 후에 만 명령문이 실행됩니다 (오류 메시지 elif[: command not found가 출력됩니다).


33
대괄호에 공백이 필요한 이유는 실제 프로그램에 대한 바로 가기이기 때문입니다 (적어도 첫 번째 대괄호, 두 번째 대괄호는 이해하는대로 구문 설탕입니다). 이해하려면 왼쪽 대괄호에 대한 실제 맨 페이지를 참조하십시오.$ man [
Michael Johansen

3
이 게시물을 오타로 폐쇄해서는 안됩니까?
zx8754

3
@ zx8754는이 오류를 해결할 수있는 정식 방법이되지는 못했지만 매우 유용한 것으로 보입니다 (360K 조회 및 계산).
fedorqui 'SO 중지 피해'11

3
내 동료 중 일부는 "공간"또는 "코딩 스타일"의 개념을 이해하지 못하므로 오타가 아닐 수도 있습니다.
juzzlin

3
[는 테스트 명령의 별명입니다. 공백 문자가 필요한 이유입니다. if test "$seconds" -eq 0; then ... fi와 같습니다 if [ "$seconds" -eq 0 ];then ... fi ]. @LeiYang는 man test당신이 실제로 찾고 무엇
Melicerte

303

스크립트에 구문 문제가 있습니다. 고정 버전은 다음과 같습니다.

#!/bin/bash

if [ "$seconds" -eq 0 ]; then
   timezone_string="Z"
elif [ "$seconds" -gt 0 ]; then
   timezone_string=$(printf "%02d:%02d" $((seconds/3600)) $(((seconds / 60) % 60)))
else
   echo "Unknown parameter"
fi

76
이상하게도, 이것은 stackexchange에서 쉽게 찾을 수 있는 유일한 완전하고 간단한 bash "if-then-else"구조였습니다 ... 감사합니다.
와일드 카드

1
들여 쓰기는 선택 사항입니다. 통역사가 될 수 있습니다 #!/bin/sh.

3
@ Chinggis6 총 말도 안돼, 통역사 는 할 수는 #!/bin/sh있지만 꼭 필요 는 없습니다.
Camusensei

4
@Camusensei sh더 높은 호환성을 위해 대신 사용할 수 있는 전체 넌센스가 아닙니다 (일부 * nix 배포판에는 기본 쉘로 bash 가있는 것은 아닙니다 (일부 ksh 또는 ash가 있지만 대부분 표준 sh에 따라 기능 에 따라 다름). bash의 경우 또는 스크립트에서 고급 기능을 사용하지 않는 경우 스크립트 자체를 처리 할 수 ​​있으므로 'sh'를 해석기 (하나 이상의 이유)로

6
@ Chinggis6 내 편에서 진실되고 나쁜 단어 선택.
Camusensei

25

[명령 (또는 일부 쉘에 내장되어 있음)입니다. 앞의 문장에서 공백으로 구분해야합니다.

elif [

3
내장 bash로 대체되었지만 메시지는 여전히 정확합니다. 사용하는 type -a [것을 볼 수 있습니다.
Camusensei

그것은 항상 나에게 이상하게 보였던 이진입니다.
mr.zog

4

bash에서 컨디셔닝의 기본 사항을 살펴 보는 것이 좋습니다.

"[" 기호 는 명령이며 그 앞에 공백이 있어야합니다. elif 뒤에 공백을주지 않으면 시스템은 elif [를 현재 원하는 것이 아닌 특정 명령으로 해석 합니다.

용법:

elif(A COMPULSORY WHITESPACE WITHOUT PARENTHESIS)[(A WHITE SPACE WITHOUT PARENTHESIS)conditions(A WHITESPACE WITHOUT PARENTHESIS)]

요컨대, 코드 세그먼트를 편집하여 다음을 수행하십시오.

elif [ "$seconds" -gt 0 ]

컴파일 오류없이 괜찮을 것입니다. 최종 코드 세그먼트는 다음과 같아야합니다.

#!/bin/sh    
if [ "$seconds" -eq 0 ];then
       $timezone_string="Z"
    elif [ "$seconds" -gt 0 ]
    then
       $timezone_string=`printf "%02d:%02d" $seconds/3600 ($seconds/60)%60`
    else
       echo "Unknown parameter"
    fi

2

프로그램 사이에 공간이 elif없고 [휴식을 취하십시오. 확인 후 수정해야합니다. 여기에 고정 된 프로그램이 있습니다 :

#!/bin/bash

if [ "$seconds" -eq 0 ]; then
   timezone_string="Z"
elif [ "$seconds" -gt 0 ]; then
   timezone_string=$(printf "%02d:%02d" $((seconds/3600)) $(((seconds / 60) % 60)))
else
   echo "Unknown parameter"
fi

그렇지 않으면bash 와 관련된 유용한 링크

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.