쉘 스크립트에서 부울 값을 나타내는 가장 좋은 방법은 무엇입니까?


15

에 부울 값이 있다는 것을 알고 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
    }

나는 주로 래퍼를 사용하려는 다른 사람들이 기대할 수있는 것에 대해 궁금합니다. 부울 값, 변수와 같은 명령 또는 호출 할 함수를 기대합니까?

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


3
help true ; help false ; help exit
Costas 2019

3
@ 코스타 정교하게 말씀해 주시겠습니까?
Minix

답변:


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

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

위의 작업을 수행하려면 null이 아닌 변수로 변수를 설정하십시오 [ -n "$var" ].

일반적으로 스크립트가 환경 변수를 true 또는 false로 해석하면 모든 값을 true로 해석하고 (일부 옵션을 구성하기 위해 해당 값을 사용함) 널값을 false로 해석합니다 .

!not의 첫 번째 인수 len 의 부울 값을 반환합니다 . 인수에 0 이외의 문자가 포함되어 있으면 0을 반환하고, 그렇지 않으면 문자가 없으면 1을 반환합니다. 이것은 [ -n "$var" ]기본적으로으로 수행 할 수있는 동일한 테스트입니다 , 그러나라는 작은 함수로 래핑합니다 bool().

이것은 일반적으로 플래그 변수가 작동하는 방식입니다. 예를 들면 다음과 같습니다.

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

스크립트의 다른 부분은 $dir그 유용성을 측정하기 위해 어떤 값만 찾으면됩니다 . 비어 있거나 설정되지 않은 매개 변수를 채우기 위해 매개 변수를 기본값으로 확장 할 수 있지만 그렇지 않은 경우 사전 설정 값으로 확장되므로 매개 변수 대체와 관련하여 편리합니다.

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

... 인쇄 할 것이다 ...

yes
unset or null

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

그리고 세 가지 선택에 관해서는-구현하기로 선택한 방법에 따라 어느 것이 든 작동 할 수 있습니다. 함수의 리턴은 자체 테스트이지만 어떤 이유로 든 리턴을 저장해야하는 경우 변수에 넣어야합니다. 유스 케이스에 따라 다릅니다. 테스트를 한 번 평가하고 유형을 평가하려는 부울 값입니까? 그렇다면 기능을 수행하십시오. 그렇지 않으면 다른 두 가지 중 하나가 필요할 수 있습니다.


1
나는 당신이 내 질문에 대답하고 있다고 생각하지 않습니다. 쉘 스크립트에서 부울을 어떻게 사용할 수 있는지 묻지는 않지만 가장 일반적인 방법은 무엇이며 다른 사용자가 기대할 수 있습니다. 내 질문이 명확하지 않은 경우 편집 해 드리겠습니다. 또한 귀하의 답변에 대한 간단한 설명이 좋습니다. 감사합니다.
Minix 2019

@Minix 더 나은가?
mikeserv 2019

나는 일반적으로 변수를 할당 true하거나 false할 수 있습니다if $variable; then ...
wurtel

@wurtel-기본값에 의존합니다-var $IFS의 값에 사용자 입력이 포함되어 있으면 행운을 빕니다. 값을 알 수없는 경우 테스트 할 필요가 거의 없습니다. if ${var:+":"} false; then부울 null / not null 값으로 작업 할 때 더 안전하게 할 수 있습니다 . 그러나 이것은 거의 유용하지 않습니다[ -n "$var" ] &&
mikeserv

스크립트를 variable=false시작한 다음 조건 (C에서 변수를 사용할 때와 마찬가지로)에 따라 true로 설정하면 아무런 문제가 없습니다. .
wurtel

4

에서 bash모든 변수 기본적으로 문자열 (또는 배열 또는 함수,하지만 일반 변수 여기에 대한하자의 이야기)입니다.

조건은 테스트 명령의 반환 값을 기반으로 구문 분석됩니다. 반환 값은 변수가 아니며 종료 상태입니다. 당신이 평가하는 경우 if [ ... ]if [[ ]]if grep something나처럼 아무것도, 반환 값 0 (안 문자열 0하지만, 종료 상태 0 = 성공)가 true를하고, 나머지는 평균 거짓 (의미 그래서, 당신은 컴파일 프로그래밍 언어에 사용되는 것과 정확히 반대, 그러나 성공할 수있는 한 가지 방법과 실패 할 수있는 여러 가지 방법이 있으며 예상되는 실행 결과는 대개 성공이므로 0이 잘못되면 가장 일반적인 기본 결과로 0이 사용됩니다). 바이너리는 테스트로 사용될 수 있기 때문에 매우 유용합니다. 실패하면 거짓, 그렇지 않으면 사실입니다.

truefalse(보통 내장 명령으로 대체) 프로그램은 아무것도하지 않고 단지 유용한 작은 프로그램입니다 - true아무것도하지 않고에서 성공하고 종료 0, 동안 false시도는 아무것도하지과 1 사운드 무의미와 exitting, "실패"하지만 스크립팅에 매우 편리합니다.

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

어쨌든 실제로 부울 값을 전달 해야하는 경우는 거의 없습니다 . 실패 bash했을 때보 다 훨씬 일반적 exit이거나 유용한 결과를 반환하거나 무언가 잘못되면 0을 반환하고 빈 문자열을 테스트하면 대부분의 경우 출구 statatus에서 직접 실패를 테스트합니다.


귀하의 경우 다른 명령으로 작동하는 함수 (따라서 성공하면 0을 반환)를 원하므로 마지막 옵션이 올바른 선택 인 것 같습니다.

또한 return진술 이 필요하지 않을 수도 있습니다 . 함수가 충분히 단순하면 함수에서 마지막으로 실행 된 명령의 상태를 단순히 반환한다는 사실을 사용할 수 있습니다. 그래서 당신의 기능은 단순히

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

장치 노드가 있는지 테스트하는 경우 (또는 grep /proc/mounts이 마운트되어 있는지 확인하려면?)


아주 좋은 요약입니다. 시간을내어 작성해 주셔서 감사합니다. 마지막 단락 drive_xyz_available()에서 가장 일반적인 옵션을 고려할 수 있다고 추론 할 수 있습니까 ?
Minix

일반적인 y = true경우에 대한 몇 가지 예를 제공 할 수 있습니까 ? 내 경험상, 대부분의 래퍼 스크립트는 널 (null) 값이 아닌지 테스트하여 적어도 해석 된 환경 변수와 관련하여 그 값을 참으로 간주합니다. 그렇지 않으면 그들은 쉘 카를 완전히 무시합니다.
mikeserv 2019

3
if변수가 인용 된 경우 테스트 용 더미 문자열 이 필요하지 않습니다. if [ "$variable" = "yes" ]$ variable이 설정되지 않은 경우에도 잘 작동합니다.
다니엘 쿨만

-2

기본적으로 0이 아닌 숫자는 true이고 0은 false입니다. 다른 종류의 오류를 식별하기 위해 스크립트 또는 다른 숫자를 성공적으로 종료하기 위해 값을 0으로 반환하는 이유.

$? 이전 명령 / 실행 파일의 종료 코드를 0으로 반환하고 다른 숫자는 반환 된 오류를 반환합니다.

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


마지막 옵션을 위해 하나를 작성하겠습니다. 감사합니다.
Minix

5
0이 아닌 숫자는 실제로 false이고 0은 true입니다. true; echo $?and의 출력을 살펴보십시오 false; echo $?.
Ruslan

@ 러시안. 내 명령의 출력을 확인 했습니까? 나는 당신이하지 않은 것 같아요, 그렇지 않으면 당신은 당신이 한 일을 말하지 않았을 것입니다. 0은 false이고 다른 숫자는 true이며 !결과를 TRUE 로 무효화 하는 이유 입니다. 명령이 올바르게 완료되면 명령의 결과는 0이며, 0이 참임을 의미하지는 않습니다. 단어 true는 0 일 수 있지만 if조건에서 알 수 있듯이 0은 절대 적용되지 않습니다 .
YoMismo

즉 C / C ++에서 말하는과 동일합니다 0입니다 true때문에 if(!x){True();}else{False();}호출 할 True()x==0. 그러나 올바른 점검은 !x아니라 오히려 !!x이다.
Ruslan

당신은 잘못입니다. 나는 ifC / C ++에서와 같이 여기 (bash, ksh 또는 tsh 또는 ...)에서 0이 거짓이라는 사실을 말한 후에 무엇을 어떤 순서로 작성했는지에 대해 이야기하고 있지 않습니다 . 다음 링크에서 읽을 수 있듯이 다른 숫자는 TRUE입니다 .C의 초기 구현은 부울 유형을 제공하지 않았으며 0은 FALSE이고 1은 TRUE 입니다. en.wikipedia.org/wiki/Boolean_data_type
YoMismo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.