에 부울 값이 있다는 것을 알고 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 }
나는 주로 래퍼를 사용하려는 다른 사람들이 기대할 수있는 것에 대해 궁금합니다. 부울 값, 변수와 같은 명령 또는 호출 할 함수를 기대합니까?
보안 관점에서 두 번째 옵션이 가장 안전하다고 생각하지만 귀하의 경험을 듣고 싶습니다.
답변
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
물론, 반대로 :+
할 수도 있지만 사전 설정된 기본값 만 제공하거나 전혀 제공하지 않는 반면 위의 양식은 값이나 기본값을 제공 할 수 있습니다.
그리고 세 가지 선택에 관해서는-구현하기로 선택한 방법에 따라 어느 것이 든 작동 할 수 있습니다. 함수의 리턴은 자체 테스트이지만 어떤 이유로 든 리턴을 저장해야하는 경우 변수에 넣어야합니다. 유스 케이스에 따라 다릅니다. 테스트를 한 번 평가하고 유형을 평가하려는 부울 값입니까? 그렇다면 기능을 수행하십시오. 그렇지 않으면 다른 두 가지 중 하나가 필요할 수 있습니다.
답변
에서 bash
모든 변수 기본적으로 문자열 (또는 배열 또는 함수,하지만 일반 변수 여기에 대한하자의 이야기)입니다.
조건은 테스트 명령의 반환 값을 기반으로 구문 분석됩니다. 반환 값은 변수가 아니며 종료 상태입니다. 당신이 평가하는 경우 if [ ... ]
나 if [[ ]]
나 if grep something
나처럼 아무것도, 반환 값 0 (안 문자열 0하지만, 종료 상태 0 = 성공)가 true를하고, 나머지는 평균 거짓 (의미 그래서, 당신은 컴파일 프로그래밍 언어에 사용되는 것과 정확히 반대, 그러나 성공할 수있는 한 가지 방법과 실패 할 수있는 여러 가지 방법이 있으며 예상되는 실행 결과는 대개 성공이므로 0이 잘못되면 가장 일반적인 기본 결과로 0이 사용됩니다). 바이너리는 테스트로 사용될 수 있기 때문에 매우 유용합니다. 실패하면 거짓, 그렇지 않으면 사실입니다.
true
및 false
(보통 내장 명령으로 대체) 프로그램은 아무것도하지 않고 단지 유용한 작은 프로그램입니다 – 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
이 마운트되어 있는지 확인하려면?)
답변
기본적으로 0이 아닌 숫자는 true이고 0은 false입니다. 다른 종류의 오류를 식별하기 위해 스크립트 또는 다른 숫자를 성공적으로 종료하기 위해 값을 0으로 반환하는 이유.
$?
이전 명령 / 실행 파일의 종료 코드를 0으로 반환하고 다른 숫자는 반환 된 오류를 반환합니다.
그래서 나는 그 방법을 참 / 거짓으로 사용할 것입니다. if (( ! $? ));then OK;else NOOK;fi