
true
환경 변수가 정의되어 있고 값이 0
, false
또는 와 다른 경우 반환되는 테스트를 찾고 있습니다 NULL
.
ENABLE_SOMETHING=1
# or ENABLE_SOMETHING=true
if ... do ...
참고: 어떤 경우에도 bash는 변수가 정의되지 않았거나 이상한 값을 가지고 있다고 불평해서는 안 됩니다. 0, 비어 있음, false 또는 정의되지 않은 변수는 true로 간주됩니다.
답변1
이러한 테스트는 Java나 C#과 같은 고급 언어에서처럼 존재하지 않지만 비교적 구성하기 쉽습니다.
귀하의 질문에 대한 세 가지 의견은 다음과 같습니다.
1: bash에서는 문자 그대로의 "true"/"false" 값을 사용하지 않습니다. 모든 명령과 조건부 구성은종료 상태, 또는논리적 결과, 이는 0(참)이거나 0이 아닌(거짓)입니다.
이것으로 작업하세요. 바퀴를 다시 발명하려고 하지 마세요.
2: 환경 변수가 아닌 이상 대문자 매개변수 이름을 사용하지 마세요. 이는 코드를 깔끔하게 유지하는 데 도움이 되는 간단한 규칙입니다.
3: "NULL"이란 정확히 무엇을 의미합니까? 리터럴 문자열없는, 빈 값, 아니면 다른 것인가요?
후자의 두 개념은 bash에 존재하지 않습니다. ㅏ없는변수가 설정 해제되어 이미 확인하고 있습니다.
가장 효과적인 솔루션은 변수(또는 bash가 호출하는 매개변수)를 허용하고 해당 조건을 확인한 다음 이를 기반으로 종료 상태를 설정하여 여러 진실 값을 리터럴 0 또는 1로 효과적으로 압축하는 함수입니다.
예를 들어:
is_true() { if [[ "$1" = 0 ]]; then false; elif [[ -z "$1" ]]; then false; elif [[ "$1" =~ [Ff][Aa][Ll][Ss][Ee] ]]; then false; fi; }
is_true "1"
0이 나오며 이는 참입니다.is_true "false"
1이 나오며 이는 거짓입니다.a=10; is_true "$a"
0을 산출한다grep -q something somefile
something
에 적어도 한 번 나타나면 0을 생성합니다somefile
.
후자의 예는 그러한 구성이 필요하지 않음을 명확하게 보여줍니다. 배쉬에서 일어나는 모든 일이미이러한 기본 0/1 진리값으로 작동합니다.
하지만 일부 형편없는 외부 프로그램의 입력을 변환해야 할 수도 있다는 점은 인정하겠습니다. :)
답변2
나는 이러한 비교가 코드의 모양을 모호하고 명확하지 않게 만들기 때문에 유용하지 않다고 생각합니다. 맨페이지에서 v4.2부터 제공되는 bash의 멋진 기능을 사용합니다.
-v varname
True if the shell variable varname is set (has been assigned a value).
사용법은 매우 간단합니다
OUTPUT_TO_LOG=1
if [ -v OUTPUT_TO_LOG ]; then
exec > &>./logfile
…
fi
즉, 활성화된 것으로 플래그를 지정하려면 정의하면 됩니다. 시도 해봐!
$ :() { if [ -v VAR ]; then echo 'existed'; fi }
$ unset VAR && : # no output
$ unset VAR && VAR= && : # "existed"
$ unset VAR && VAR=1 && : # "existed"
답변3
정규식 일치를 사용하여 세 가지 검사를 모두 수행할 수 있습니다(정의되지 않은 매개변수는 빈 문자열로 해석됨).
is_true() (
shopt -s nocasematch
[[ ! $1 =~ ^(false|0|)$ ]]
)