플래그와 기타 조건을 확인하는 간단한 스크립트를 실행하려고 합니다. 플래그 값에 관계없이 다음은 항상 "Run script.."를 에코합니다.
FLAG_Control=false
if [ $FLAG_Control ] && [ -d /path/to/dir ];then
echo "Run script.."
fi
이는 예상대로 작동하지만:
FLAG_Control=false
if [ $FLAG_Control = true ] && [ -d /path/to/dir ];then
echo "Run script.."
fi
이것은 명시적인 비교를 해야 한다는 것을 의미합니까? 제가 처음에 뭔가 잘못한 걸까요?
답변1
를 사용해 보십시오 if $FLAG_Control && [ -d /path/to/dir ]; ...
. 대괄호는 if
; 구문의 일부가 아닙니다. 이 경우 명령( 또는 ) $FLAG_Control
으로 해석되기를 원하며 이는 다른 절과 잘 작동합니다 . (이는 변수가 항상 또는 로 설정되어 있다고 가정합니다 .)true
false
&&
[ ... ]
true
false
초기 테스트가 예상한 대로 수행되지 않은 이유는 test
다음 문서에서 확인할 수 있습니다 [
.
-n STRING
the length of STRING is nonzero
STRING equivalent to -n STRING
여기에는 특별한 의미가 없으므로 false
, 그냥 비어 있지 않은 문자열로 취급되어 진리값으로 해석됩니다.
답변2
저는 지난 몇 달 동안 bash 스크립팅을 배워왔습니다. 내가 아는 한 bash에는 부울 변수가 없습니다. 그러나 부울 값이 없다는 의미는 아닙니다.
If/then은 1 또는 0을 찾습니다. 이제... 주의 사항이 있습니다. 0은 true이고 나머지는 모두 false입니다. 예를 들어 a가 직접 존재하는지 확인하면 1이 아닌 0이 반환됩니다.
호출한 함수에서 어떤 종류의 오류 코드라도 나타나면 해당 오류를 포착할 수 있습니다.
따라서 다음을 시도해 보십시오.
FLAG_Control=1
if [ $FLAG_Control ] && [ -d /path/to/dir ];then
echo "Run script.."
fi
답변3
a에 가장 가까운 것진짜쉘 변수의 값은 다음과 같습니다.놓다값. 여기에 종속되는 몇 가지 기본 매개변수 속성도 있습니다. 예를 들어:
FLAG=
[ -d "${FLAG:+$HOME}" ] || ! echo \
either \$HOME is not a directory or \$FLAG is null or unset
위의 내용은 null 이 아닌 설정되어 있는 경우에만 $FLAG
조건부로 값으로 확장됩니다 . $HOME
여기에는 여러 가지 변형이 있지만 일반적인 요점은 매개변수의 값이 매개변수의 존재 여부만큼 항상 중요하지는 않다는 것입니다.가지다가치. FLAG
위의 값 중 하나로 설정하면 test
실패가 아닌 실제 반환이 발생합니다.