쉘 스크립트에서 부울 값을 표현하는 모범 사례는 무엇입니까?

쉘 스크립트에서 부울 값을 표현하는 모범 사례는 무엇입니까?

에 부울 값이 있다는 것을 알고 있지만 bash어디에도 사용되는 것을 볼 수 없습니다.

예를 들어 이 특정 USB 드라이브가 연결/마운트되었는지 여부와 같이 내 컴퓨터에서 자주 검색되는 정보에 대한 래퍼를 작성하고 싶습니다.

이를 달성하기 위한 모범 사례는 무엇입니까?

  • 밧줄?

    drive_xyz_available=true
    
  • 숫자(0은 참, ≠0은 거짓)인가요?

    drive_xyz_available=0    # evaluates to true
    
  • 기능?

    drive_xyz_available() { 
        if available_magic; then 
                return 0 
        else 
                return 1 
        fi
    }
    

저는 주로 래퍼를 사용하려는 다른 사람들이 무엇을 기대할 수 있는지 알고 싶습니다. 부울, 변수와 유사한 명령 또는 함수가 호출되기를 기대합니까?

보안 관점에서는 두 번째 옵션이 가장 안전하다고 생각하지만, 여러분의 경험을 듣고 싶습니다.

답변1

bool(){ return "$((!${#1}))"; }

if bool "$var"
then : do true
else : do false

단순히 변수를 null을 제외한 다른 것으로 설정하면 위의 작업이 [ -n "$var" ]더 짧아지기는 하지만(명확하지 않은 경우) 수행됩니다.

일반적으로 스크립트가 환경 변수를 true 또는 false로 해석하면 모든 값을 true로 해석합니다.(명시된 값은 특정 옵션을 구성하는 데 사용되는 경우도 있습니다)그렇지 않으면 null 값이 false로 처리됩니다.

위의 !not함수는 인수에 0 이외의 문자가 포함된 경우 첫 번째 인수 len - 0에 대한 부울 값을 반환하고, 그렇지 않으면 문자가 전혀 없는 경우 1을 반환합니다. [ -n "$var" ]기본적으로 이는 를 사용하여 수행할 수 있는 것과 동일한 테스트이지만 이라는 작은 함수로 마무리됩니다 bool().

보통 이런 식이다배너변수가 작동합니다. 예를 들어:

[ -d "$dir" ] || dir=

$dir스크립트의 나머지 부분에서는 유용성을 측정 하기 위해 값을 찾으면 됩니다 . 이는 매개변수 대체에 있어서도 편리합니다. 매개변수는 기본값으로 확장되어 비어 있거나 설정되지 않은 매개변수를 채울 수 있지만 그렇지 않으면 사전 설정된 값으로 확장될 수 있습니다. 예를 들어...

for set in yes ''
do echo "${set:-unset or null}"
done

...이것이 인쇄됩니다...

yes
unset or null

물론 반대의 경우도 가능 :+하지만 이는 사전 설정된 기본값만 제공하거나 전혀 제공하지 않는 반면, 위 형식은 값 또는 기본값을 제공할 수 있습니다.

따라서 이 세 가지 옵션과 관련하여 구현 방법에 따라 어느 것이든 작동할 수 있습니다. 함수의 반환은 자체 테스트이지만 어떤 이유로든 반환을 저장해야 하는 경우 변수에 넣어야 합니다. 사용 사례에 따라 다릅니다. 테스트를 한 번 평가하고 부울 유형으로 완료하길 원하시나요? 그렇다면 해당 기능을 수행하고, 그렇지 않으면 다른 두 가지 중 하나가 필요할 수 있습니다.

답변2

bash변수는 본질적으로 문자열(또는 배열이나 함수이지만 여기서는 일반 변수에 대해 이야기하고 있음)입니다.

조건은 테스트 명령의 반환 값을 기반으로 구문 분석됩니다. 반환 값은 변수가 아니라 종료 상태입니다. 평가할 때 if [ ... ]반환 값 0(문자열 0이 아니라 종료 상태 0 if [[ ]]= if grep something성공)은 true를 의미하고 나머지는 false를 의미합니다. 따라서 컴파일 프로그래밍에서 익숙한 것과 정반대입니다. 그러나 성공하는 방법은 하나이고 실패하는 방법은 여러 가지가 있으며, 예상되는 실행 결과는 일반적으로 성공이므로 문제가 발생하지 않을 경우 가장 일반적인 기본 결과로 0이 사용됩니다. 이는 모든 바이너리를 테스트로 사용할 수 있기 때문에 유용합니다. 실패하면 false이고 그렇지 않으면 true입니다.

true프로그램 false(일반적으로 내장 기능으로 재정의됨)은 아무것도 하지 않는 유용한 작은 프로그램입니다. true성공적으로 아무 작업도 수행하지 않고 0으로 종료되는 반면, false시도는 아무것도 하지 않고 "실패"하여 1로 종료됩니다. 무의미하게 들리지만 스크립팅에는 매우 편리합니다.

진실을 전달하는 방법은 당신에게 달려 있습니다. 진위 여부와 사용법을 나타내기 위해 "y" 또는 "yes"만 사용하는 것이 일반적입니다 ( 길이가 0인 경우 구문 분석할 수 없는 가짜 명령이 생성되는 것을 방지하기 위해 더미 if [ x"$variable" = x"yes" ]문자열이 추가됨 ). 단순히 빈 문자열을 사용하여 false를 나타내고 길이가 0인지(또는 0이 아닌지) 테스트하는 것도 유용할 수 있습니다 .x$variableif [ = "yes" ][ -z "$variable ]-n

어쨌든 실제로 부울을 전달하는 것이 필요한 경우는 거의 없습니다 bash. 단순히 실패하거나 유용한 결과(또는 문제가 발생하면 0을 반환하고 빈 문자열을 테스트)를 반환하는 것이 더 일반적 exit이며 대부분의 경우 직접 수행할 수 있습니다. 종료에서 테스트 실패 상태.


귀하의 경우에는 다른 명령처럼 작동하는 함수(따라서 성공 시 0을 반환)가 필요하므로 마지막 옵션이 올바른 선택인 것 같습니다.

게다가 return진술이 필요하지 않을 수도 있습니다. 함수가 충분히 단순하다면 함수에서 실행된 마지막 명령의 상태만 반환한다는 사실을 활용할 수 있습니다. 따라서 귀하의 기능은 간단하게

drive_xyz_available() {
   [ -e /dev/disk/by-uuid/whatever ]
}

장치 노드가 존재하는지 테스트하는 경우(또는 /proc/mounts마운트되었는지 확인하기 위해 grep을 사용합니까?)

답변3

기본적으로 0이 아닌 모든 숫자는 참이고, 0은 거짓입니다. 반환 값 0은 스크립트가 성공적으로 종료된 이유를 나타내거나 다른 유형의 오류에 대한 이유를 식별하는 다른 숫자를 나타냅니다.

$?이전 명령/실행 파일의 종료 코드, 성공의 경우 0, 반환된 오류를 나타내는 기타 숫자를 반환합니다.

그래서 나는 그 방법을 사용하여 참/거짓을 판단할 것입니다.if (( ! $? ));then OK;else NOOK;fi

관련 정보