완전한 답변

완전한 답변

나는 이것을 사용하려고합니다 :

$ if [$a == 1] then { echo 'yes'; } fi;

하지만 오류가 발생합니다.

-bash: syntax error near unexpected token `}'

올바른 형식은 무엇입니까? 여러 가지를 시도했지만 운이 없었습니다.

답변1

[bash에 따르면 이는 또 다른 문자일 뿐이며 자체 정의되지 않습니다. 따라서 [및 주위에 공백을 추가 해야 합니다 ]. [[and 를 사용하는 것이 더 나을 수도 있습니다 ]].

그리고 다음 명령 if(예, 명령입니다) [은 또는 개행 문자로 끝나야 합니다.;

마지막으로 ==(POSIX, FWIW가 아님, POSIX가 선호함 =) 숫자 평등이 아닌 문자열 평등입니다.

그래서 당신이 의미하는 것은 아마도 다음과 같습니다:

if [[ $a -eq 1 ]]; then echo yes; fi

하지만 대신 산술 평가를 사용할 수 있습니다.

if ((a == 1)); then echo yes; fi

(산술평가에서 상등은 이고 ==, 변수명 앞에 붙을 필요가 없습니다 $. 헷갈리는 건 압니다.)

자세한 내용은 [: help test. 정보 [[: 도움말 [[(기준 test). 에 대한 ((: help let. 에 대한 bash:man bash

답변2

일반화하다

사용:

if [ "$a" = 1 ]; then echo yes; fi

완전한 답변

배쉬 오류:-bash: 예상치 못한 마커 "}" 근처에서 구문 오류가 발생했습니다.이는 코드 작성자가 오류를 찾도록 안내하려는 시도이지만 bash는 잘못된 위치에서 오류 및 신호 오류가 발생하기 쉽습니다.

실제로 코드에는 몇 가지 오류가 있습니다. 하지만 더 간단한 코드 줄을 사용하여 bash가 보고한 오류를 재현해 보겠습니다.

$ if true then { true; } fi;
bash: syntax error near unexpected token `}'

행이 약간 변경된 경우 오류는 거의 동일한 위치에서 보고되지만 약간 다릅니다.

$ if true then true; fi;
bash: syntax error near unexpected token `fi'

그리고 다음과 같은 오류도 보고됩니다.

$ if true; then; true; fi;
bash: syntax error near unexpected token `;'

이 모든 것은 필수 구문(매뉴얼에서 복사)이 다음과 같기 때문에 발생합니다.

if list; then list; fi;

list하나 이상의 단순 명령(또는 파이프 또는 복합 명령)이 다음으로 끝나는 위치는 어디 입니까?새로운 팀또는세미콜론. 일반적으로 개행 문자는 세미콜론으로 대체될 수 있으며 그 반대의 경우도 가능합니다.

작동합니다(구문 오류는 보고되지 않음).

if   true;   then   true;   fi

이것은 또한 작동합니다:

if     true
then   true
fi

또는:

if echo start; true; then echo decision; true; echo next; fi;

또는 개행 및/또는 세미콜론의 다른 변형입니다.

물론 마지막 세미콜론은 필수는 아니지만 금지되는 것도 아닙니다.

또한 bash에서 단어(토큰)로 구별하여 테스트로 이해하려면 (일반적으로) 공백이 필요합니다 [.]

if [ $a == 1 ]; then { echo 'yes'; } fi;       # still subtly incorrect.

"$a"그러나 변수 확장도 따옴표( ) 로 묶어야 합니다. 이는 bash에서는 작동하지만 일부 다른 쉘에서는 작동하지 않을 수 있으므로 기술적으로 인용이 필요하지 않은 내부 단일을 ==사용해야 합니다 (해를 끼치지는 않지만). 하나의 간단한 명령 중괄호가 필요하지 않으므로 더 나은 버전이 됩니다.=[ ]'yes'{ }

if [ "$a" = 1 ]; then echo yes; fi

또는 bash/ksh/zsh를 사용하기로 선택한 경우 [[ ]]:

if [[ $a == 1 ]]; then echo yes; fi

=마지막으로 or를 사용한 테스트는 ==숫자 비교가 아닌 문자열 비교 +1이므로아니요1동일한 가치를 갖고 있음에도 불구하고. 수치 테스트를 수행하려면 를 사용할 수 있습니다 -eq.

답변3

[if등과 while같은 다른 명령과 마찬가지로 Bash의 명령입니다. 매뉴얼 페이지를 주의 깊게 살펴보면 다음과 같은 내용을 볼 수 있습니다.

$ man [
NAME
       bash, :, ., [, alias, bg, bind, break, builtin, caller, cd, command, .....

다음 예를 보면 이것이 실제 명령임을 알 수 있습니다.

$ type -a [
[ is a shell builtin
[ is /usr/bin/[

첫 번째 결과는 [Bash의 내장 버전입니다. 두 번째는 [GNU coreutils에 포함된 버전입니다.

Fedora에서는 해당 RPM이 속한 RPM을 확인할 수 있습니다.

$ rpm -qf /usr/bin/[
coreutils-8.5-7.fc14.x86_64

따라서 올바르게 구문 분석되도록 모든 명령 주위에 공백이 있는지 확인해야 합니다.

이 방법:

$ if [$a == 1] ...

이것과 동일:

$ lsblah
bash: lsblah: command not found...

ls구문 분석할 수 있도록 공백으로 버퍼링되지 않았기 때문에 명령이 올바르게 구문 분석되지 않습니다 .

답변4

if [ "$a" = 1 ]; then echo yes; fi

또는

if test "$a" -eq 1 ; then echo yes; fi

또는

if /usr/bin/test "$a" -eq 1;then echo yes;fi

쉘은 세미콜론에서 테스트하기 위해 명령줄을 잘라냅니다(그런 다음 테스트된 명령줄에 인수를 추가합니다 - 내장된 것이 아닌 경우 argc/argv).

하지만 이것은 작동하지 않습니다.

if test "$a"-eq 1; then echo yes; fi

쉘은 테스트할 매개변수를 어디에서 분할해야 합니까? 따라서 문자열 '+1-eq 1'은 분할되지 않습니다.

이렇게 하면 테스트가 별도의 프로그램이라는 것이 분명해집니다.

 sh:~$ LANG=C sh -c 'a=+1 ; if test "$a"-eq 1 ; then echo yes ; fi'
 sh: 1: test: +1-eq: unexpected operator

이와 대조적으로:

 sh:~$ LANG=C sh -c 'a=+1 ; if /usr/bin/test "$a"-eq 1;then echo yes;fi'
 /usr/bin/test: missing argument after '1'

음, 테스트 중인 동일한 매개변수에 대해 서로 다른 오류 메시지가 있습니다...

관련 정보