2009-06-23 3 views
0

bash 스크립트에서 함수를 작성했습니다. 그러나 구문에 대해 불평하고 있습니다. 내가 정말 무엇인지 볼 수 없습니다 ..... 오류 메시지는 [: 실종`] 'bash 쉘 스크립트 구문 오류

addem() { 
      if [ $# -eq 0] || [ $# -gt 2 ] 
      then 
        echo -1 
      elif [ $# -eq 1 ] 
      then 
        echo $[ $1 + $1 ] 
      else 
        echo $[ $1 + $2 ] 
      fi 
    } 

답변

12

] 앞에 공백이 필요합니다. 즉 :
변화 :
if [ $# -eq 0] || [ $# -gt 2 ]
에 :
if [ $# -eq 0 ] || [ $# -gt 2 ]

+4

약간의 역사 : 이것은 '['는 역사적으로 쉘에 내장되어 있지만 인수로 표현식을 수신하고 결과를 반환 한 별도의 실행 파일이기 때문입니다.'['를 공백으로 묶지 않으면 쉘은 다른 파일 이름을 찾기 위해 $ PATH를 검색합니다 (찾을 수 없습니다). –

3

시도 :

if [ $# -eq 0 ] || [ $# -gt 2 ] 

(0과 사이에 공간이 없었다].)

1

배시는 공백에 민감합니다. 첫 줄에 [Y - eq X]가 [Y - 공백 X] (공백 앞의 공백)로 바뀌면

0

당신은 브래킷을 피하고 대신 test을 사용해야합니다

if test $# -eq 0 || test $# -gt 2 
then 
    echo -1 
elif test $# -eq 1 
then 
    echo $(($1 + $1)) 
else 
    echo $(($1 + $2)) 
fi 

better shell style 당신이 더 나은 것하기. :)

+0

아니요, 테스트 또는 단일 대괄호 대신 이중 대괄호를 사용해야합니다. –

2

indyK1ng : "#"은 다음 문자를 이스케이프하기 때문에 "#"은 주석으로 처리되지 않습니다. "$ #"은 현재 컨텍스트에 존재하는 위치 매개 변수의 수를 나타내는 내부 변수입니다. 이것은 쉘 스크립트에 대한 명령 행 인수의 수로 생각할 수 있지만 내장 된 "set - [args]"를 사용하여 어레이를 재설정 할 수 있습니다.

Joakim Elofsson : if 문의 전체 구조 올바른지, ";" 별도의 줄에 나열되지 않은 경우 "그 다음"과 "fi"앞에 필요합니다.

문제는 "0"과 브래킷 사이의 간격입니다. Bash는 조건식을 구분하는 데 사용되는 대괄호는 표현식에서 적어도 하나의 공백으로 설정해야한다고 요구합니다.

 if [ $# -eq 0] || [ $# -gt 2 ] # Wrong 

     if [ $# -eq 0 ] || [ $# -gt 2 ] # Correct 

두 개의 조건식을 결합 할 수 있습니다. 운영자 협회는 모든 것이 잘 작동하는지 확인합니다.

 if [ $# -eq 0 -a $# -gt 2 ] # Even Better 

표현 평가를 위해 이중 브래킷과 함께 제공되는 확장 기능을 선호하는 경향이 있습니다. 두 평가의 조합은 다른 연산자로 수행됩니다. 나는 이것이 더 읽기 쉽다고 생각한다.

 if [[ $# -eq 0 || $# -gt 2 ]] # My preference 

나중에 스크립트에서 정수 추가에 단일 대괄호를 사용하지 않는 것이 좋습니다. 단일 대괄호는 표현식을 부울로 평가합니다. 정수 연산에는 두 배의 괄호가 사용됩니다.

   echo $[ $1 + $1 ] # Evaluation of an expression 

       echo $(($1 + $1)) # Integer math 
1

필자는 아래에 설명 된대로 확장 테스트 구성 (BASH)을 사용합니다. 필자는 문자 수를 줄이고 가독성을 높일 것이라고 생각합니다 (적어도 프로그래머에게는). :-)

addem() { 
     if (($# == 0 || $# > 2)) 
     then 
       echo -1 
     elif (($# == 1)) 
     then 
       echo (($1 + $1)) 
     else 
       echo (($1 + $2)) 
     fi 
} 
+0

이유는 무엇입니까? – ghostdog74

+0

고마워. 어떻게 생겨 났는지 궁금하네요. – Jayan