X“”가있는 빈 문자열 테스트
이 질문에 이미 답변이 있습니다.
다음과 -z
같이 Bash에서 빈 문자열을 테스트 할 수 있다는 것을 알고 있습니다 .
if [[ -z $myvar ]]; then do_stuff; fi
하지만 다음과 같이 작성된 코드가 많이 있습니다.
if [[ X"" = X"$myvar" ]]; then do_stuff; fi
그 방법이 더 이식 가능합니까? 그것은 그저 과거의 역사적인 잔해 -z
일까요? POSIX 셸용 bash
입니까 ( 타게팅하는 스크립트에서 사용 된 것을 보았지만 )? 내 역사 / 휴대 성 강의를 준비했습니다.
bash 변수가 비어 있는지 확인하는 방법 과 같은 질문이 Server Fault에 대해 요청되었습니다 . 그러나 아무도 당신 이 왜 그 X""
물건 과 함께 코드 를 보는지에 대한 설명을 제공하지 않았습니다 .
근본적으로, 과거에는의 동작 test
이 더 복잡하고 다른 시스템에서 균일하게 정의되지 않았기 때문에 (따라서 이식 할 수없는 구조를 피하기 위해 이식 가능한 코드를 신중하게 작성해야했습니다).
특히, 이전 test
은 별도의 실행 파일 (및 맥 OS X은 여전히 가지고 있음을 참고했다, 쉘 내장했다 /bin/test
및 /bin/[
실행으로는). 이 경우 다음과 같이 작성하십시오.
if [ -z $variable ]
$variable
비어있을 때 [
3 개의 인수가 있는 별칭 을 통해 테스트 프로그램을 호출합니다 .
argv[0] = "["
argv[1] = "-z"
argv[2] = "]"
변수가 비어있어서 확장 할 것이 없었기 때문입니다. 따라서 코드를 작성하는 안전한 방법은 다음과 같습니다.
if [ -z "$variable" ]
이것은 4 개의 인수를 test
실행 파일에 전달하여 안정적으로 작동합니다 . 물론, 테스트 프로그램은 수십 년 동안 대부분의 포탄에 내장되어 있었지만 오래된 장비는 힘들게 죽고 더 오래 전에 배운 모범 사례도 마찬가지입니다.
X 접두사로 해결 된 다른 문제는 변수에 선행 대시가 포함되거나 같거나 다른 비교자가 포함 된 경우 발생하는 문제입니다. 다음을 고려하십시오 (매우 좋은 예는 아닙니다).
x="-z"
if [ $x -eq 0 ]
잘못된 (잘못된) 인수가있는 빈 문자열 테스트입니까, 아니면 숫자가 아닌 첫 번째 인수가있는 숫자 동등성 테스트입니까? POSIX가 1990 년경 행동을 표준화하기 전에 다른 시스템에서 다른 답변을 제공했습니다. 따라서이를 처리하는 안전한 방법은 다음과 같습니다.
if [ "X$x" = "X0" ]
또는 (보통 내 경험으로는 적지 만 완전히 동등 함) :
if [ X"$x" = X"0" ]
테스트가 별도의 실행 파일 일 가능성과 결부 된이 모든 경우에 해당했습니다. 즉, 이식 가능한 셸 코드는 현대 셸이 실제로 요구하는 것보다 더 많은 양의 큰 따옴표를 사용하고 X- 접두사 표기법을 사용하여 일이 잘못 해석되지 않도록하십시오.
아, 이것이 제가 선호하는 질문과 답변 중 하나입니다. 생각 만해도 답이 나왔기 때문입니다. 은 X
단지의 경우에서와 문자열 시작 설정 -
테스트를위한 플래그로 간주 될 수있다. X
앞에를 넣으면 해당 사례가 제거되고 비교는 계속 유지 될 수 있습니다.
나는 또한 이런 종류의 트릭이 과거, 가장 오래된 컴퓨팅 시대에서 상속 된 것이므로 가장 이식성이 높은 쉘 스크립트 (autoconf, configure 등)를 읽으려고 할 때 발생하기 때문에 이것을 좋아합니다.
참고 URL : https://stackoverflow.com/questions/6852612/test-for-empty-string-with-x
'developer tip' 카테고리의 다른 글
beforefieldinit 플래그는 무엇을합니까? (0) | 2020.10.19 |
---|---|
레일스 form_tag에 html ID를 추가하는 방법 (0) | 2020.10.19 |
knockout.js-DOM 요소에서 ViewModel 가져 오기 (0) | 2020.10.19 |
뒤로 대신 도구 모음의 재질 "닫기"버튼 (0) | 2020.10.19 |
SQL Developer에서 저장 프로 시저를 실행 하시겠습니까? (0) | 2020.10.19 |