Linux의 간단한 플래그 기반 비교

Linux의 간단한 플래그 기반 비교

플래그와 기타 조건을 확인하는 간단한 스크립트를 실행하려고 합니다. 플래그 값에 관계없이 다음은 항상 "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으로 해석되기를 원하며 이는 다른 절과 잘 작동합니다 . (이는 변수가 항상 또는 로 설정되어 있다고 가정합니다 .)truefalse&&[ ... ]truefalse

초기 테스트가 예상한 대로 수행되지 않은 이유는 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실패가 아닌 실제 반환이 발생합니다.

관련 정보