누락된 연산자 문제

누락된 연산자 문제

If 조건에서 OR 논리를 수행하려고 합니다.

condition 1 => warning ="" and err_code !=1
OR
condition 2 => threshold =1 and threshold_load_ind=Y and err_code!=1

이는 운영자 수준에서 의문을 제기합니다. if 코드에서 누락된 내용

if [  "$warn" != ""  &&  "$err_ind" != 1  ] || [  $thres_err_ind == 1   &&  $thres_load_ind == "Y"  &&  $err_ind != 1  ];then

860행의 오류 코드

[860]: [: ']' missing
[860]: [: ']' missing

답변1

[(재미있는 이름을 가진) 일반적인 명령입니다.아니요쉘 구문의 일부. 혼란스럽게도 구문 요소처럼 보이게 하기 위해 ]마지막 인수로 처리될 것으로 예상합니다. 그러나 &&과 는 ||쉘 구문의 일부이므로 명령을 구분합니다. 따라서 if 문에는 다음과 같이 레이블이 지정된 5개의 명령이 있습니다.

if [ "$warn" != ""  && "$err_ind" != 1  ] ||
   1^^^^^^^^^^^^^^^    2^^^^^^^^^^^^^^^^^

   [ $thres_err_ind == 1 && $thres_load_ind == "Y" && $err_ind != 1 ];
   3^^^^^^^^^^^^^^^^^^^^    4^^^^^^^^^^^^^^^^^^^^^    5^^^^^^^^^^^^^^

첫 번째 런타임은 , [빈 문자열의 내용을 포함한 세 개의 매개변수를 사용합니다. 아니요, 그래서 명령이 불평했습니다. 아래 명령은 실패로 인해 실행되지 않지만, 그 이후의 명령은 비슷한 이유로 실행되고 불평합니다. (다른 사람이 실행하는 경우 변수가 명령 위치에 있기 때문에 "명령을 찾을 수 없음" 오류가 발생할 수 있으며 예를 들어 포함된 경우 쉘은 명령을 실행하려고 시도합니다.)$warn!=][&&||err_ind00

또한 쉘 &&||연산자에는동일한우선순위이므로 a && bb || c && d동작은 와 유사 ( (a && bb) || c) && d하지만 아마도 원하는 것이 아닐 수도 있습니다.

]따라서 / 앞에 종결자를 추가하고 명령을 수동으로 그룹화 해야 합니다 .&&||

if { [ ... ] && [ ... ]; } ||
   { [ ... ] && [ ... ] && [ ... ]; }; then ...

또는 마지막 번거로움이 필요하지 않지만 ;하위 셸을 시작하는 괄호를 사용하면 약간의 성능 저하가 발생합니다.

if ( [ ... ] && [ ... ] ) ||
   ( [ ... ] && [ ... ] && [ ... ] ); then ...

[[또는 (Bash/ksh/zsh에서) 테스트 사용으로 전환하세요 .쉘 구문은 다양한 규칙으로 작동하며 &&/ 를 지원합니다 ||.

바라보다:

관련 정보