나는 이것을 사용하려고합니다 :
$ 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'
음, 테스트 중인 동일한 매개변수에 대해 서로 다른 오류 메시지가 있습니다...