var="$(command1 -l "$var2" -c "command2|grep -c "search"")" if [[ var !=0 ]]; then fi
왜 “조건부 이진 연산자 예상”이 표시됩니까? 나는 이미 수색했다. I. [[]]이 테스트 문이지만 작동하지 않는 이유는 무엇입니까?
답변
- 당신 “당신이 작성한 것처럼 var를 호출 할 때 var 앞에
$
가 없습니다. 문자 그대로var
가됩니다. -
[[ ... ]]
또는(( ... ))
를 사용할 때 스크립트의 가능한 취약점 을 고려하세요. div>를 제어 할 수없는 변수와 함께 사용하세요. 귀하의 경우에는[ "$var" -ne 0 ]
를 사용하는 것이 더 나을 수 있습니다. -
!=
및0
(오류의 원인입니다!) -
!=
은 문자열 비교 연산자 이지만 예제에서는 작동 할 수 있지만-ne
를 사용하여 정수를 비교할 수 있습니다.
shellcheck 를 사용합니다.
(( var !=0 ))
도 여기서 작동하지만[[ "$var" -ne 0 ]]
와 마찬가지로 캡처되는 명령의 출력 특성이있는 경우 임의의 명령 주입 취약점이됩니다. 제어 할 수 없습니다.[[ "$var" -ne 0 ]]
이 안전하지 않다고 생각하십니까? 따옴표없이 같은 것은 어떻습니까? 그렇다면 무엇을 선호해야한다고 생각하십니까?[[ $var -ne 0 ]]
(따옴표 포함 또는 제외,이 특정 경우에는 따옴표가 필요하지 않음) 또는(( var!=0 ))
,$var
의 내용은 산술 표현식으로 평가되고 나쁜 일이 발생할 수 있습니다. .[ "$var" -ne 0 ]
([
는 일반 명령이므로 여기에 필요한 따옴표)는bash
(다른 모든 쉘은 아님),$var
는 10 진수로만 해석되기 때문입니다.[ "$var" != 0 ]
(또는[[ $var != 0 ]]
kshism)도 안전하지만$var
인 경우 true를 반환합니다.00
를 ' 문자열 비교로 포함합니다.