2017-02-26 3 views
1

Bourne 셸을 기반으로하는 Korn 셸을 배우고 있습니다. 아래는 내 간단한 코드입니다. || 운영자가 나에게 오류를주고 몇 가지 이유를 들어 korn 셸 오류 [: missing`] '

read ab 
if [ $ab = "a" || $ab = "A" ] ; then 
    echo hi 
fi 

: 당신의 if 조건을 작성하는

[: missing `]' 
a: command not found 
+2

를 작성 만드는'||는'이 아닌'['명령 (예,'['명령이다)에 의해, 쉘에 의해 해석된다. 따라서'['는'$ ab = "a"'인자로 호출되며, 누락 된']'에 대해 불평합니다. 당신은'-o'를 사용할 수 있습니다. 이것은''''에 대한 "or"명령이지만, @codeforester의 메소드가 아마도 더 좋은 방법 일 것입니다. –

+0

@KeithThompson - 나는 최근 버전의 Bash에서'-o'가 더 이상 사용되지 않는다는 것을 알게되었습니다. ksh에 대해 잘 모르겠다. – codeforester

+2

@codeforester, 실제로 특정 POSIX가 아닌 POSIX 사양으로되어 있습니다. –

답변

3

올바른 방법은 다음과 같습니다

[ ... ]
read ab 
if [ "$ab" = "a" ] || [ "$ab" = "A" ]; then 
    echo hi 
fi 

, 그것을 넣어하는 것이 필수적입니다 변수는 큰 따옴표로 묶습니다. 그렇지 않으면, 변수가 아무것도 확장되지 않거나 확장에 공백이 포함되면 쉘은 구문 오류로 실패합니다.


은 참조 :

+0

$ {ab}를 사용하고 있습니다. 큰 따옴표를 사용하는 것이 좋습니다. –

+1

@ Mint.K : 예. '$ {ab}'는 여백에 공백이 있으면 두 개 이상의 단어로 확장됩니다. –

+0

@ Mint.K, 쉘 변수 이름의 일부로 합법적 인 문자로 시작하는 문자열로 연결 연산을 수행하지 않는 한'$ ab '는'$ ab'와 전혀 다르지 않습니다. '$ {ab} _foo'). –

1

당신이 KSH를 사용하거나 현대 bash는 당신이 표준이 아닌 [[를 사용할 수 있다면 ... [ 대신 ]] ... ].

이 두 가지 이점이 있습니다

  1. 당신은 ]]
  2. 변수 확장 따옴표가 필요하지 않습니다 ... ||[[ 내부 사용할 수 있습니다.

이것은 안전하고 짧은

[[ $ab = a || $ab = A ]] 
관련 문제