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_ind
0
0
또한 쉘 &&
과 ||
연산자에는동일한우선순위이므로 a && bb || c && d
동작은 와 유사 ( (a && bb) || c) && d
하지만 아마도 원하는 것이 아닐 수도 있습니다.
]
따라서 / 앞에 종결자를 추가하고 명령을 수동으로 그룹화 해야 합니다 .&&
||
if { [ ... ] && [ ... ]; } ||
{ [ ... ] && [ ... ] && [ ... ]; }; then ...
또는 마지막 번거로움이 필요하지 않지만 ;
하위 셸을 시작하는 괄호를 사용하면 약간의 성능 저하가 발생합니다.
if ( [ ... ] && [ ... ] ) ||
( [ ... ] && [ ... ] && [ ... ] ); then ...
[[
또는 (Bash/ksh/zsh에서) 테스트 사용으로 전환하세요 .예쉘 구문은 다양한 규칙으로 작동하며 &&
/ 를 지원합니다 ||
.
바라보다: