bash 스크립트[x$1 = x]

bash 스크립트[x$1 = x]

bash 스크립트를 읽고 있는데 무슨 일이 일어나고 있는지 이해가 되지 않습니다.

#!/bin/sh
[ x$1 = x ] 

두 번째 줄에서는 어떤 일이 발생하며 [ x$1 = x ] 이는 무엇을 의미하나요?

답변1

$1따옴표로 묶어야 하지만 null인지 확인합니다 ( 와 동일 [ -z "$1" ]). 일부 아주 오래된 쉘은 빈 문자열을 올바르게 처리하지 못했기 때문에 이식 가능한 스크립트 작성자는 이 검사를 구현했습니다. 수십 년 동안은 이것이 필요하지 않았지만 사람들이 여전히 그렇게 하기 때문에 사람들은 여전히 ​​그것을 하고 있습니다.

답변2

대괄호는 다음을 나타냅니다.시험, 문법적으로는 괜찮지만 그런 것이 [ x$1 = x]없으면 의미가 없습니다.if

x$1로 확장되면 true로 평가되고, x그렇지 않으면 false로 평가됩니다. 그러나 인용되지 않았기 때문에 $1쉘은 (예를 들어) "hey x"인 경우 이를 보게 되므로 x = x이 구성은 여전히 ​​안전하지 않습니다.

검사의 목적은 x = x변수가 비어 있는지 확인하는 것입니다. 보다 일반적인 접근 방식은 따옴표를 사용하는 것입니다.

if [ "$1" = "" ]; then

Bash 테스트 연산자 -z-n사용할 수 있지만 다른 유형의 셸에는 이식성이 떨어집니다. 1

따옴표를 사용하는 이유는 x$1왼쪽이 null로 확장되지 않도록 하기 위한 것입니다. 이는 구문 오류입니다.

if [  = x ]  # No good!
if [ "" =  "" ] # Okay.
if [ x = x ] # Also okay.

1. 실제로는 독립형 test유틸리티일 수도 있지만 대부분의 쉘에서는 이를 내장형으로 구현합니다 . GNU/Linux에서는 내장 함수를 참조한다고 주장하지만, (예를 들어) 호출하면 유틸리티는 및 를 포함하여 매뉴얼 페이지에 문서화된 기능을 구현하는 것으로 나타납니다 .which testtype testman test/usr/bin/test-z-n

답변3

[ x$1 = x ]

에서만 zsh. 이것은 x연결을 스크립트의 첫 번째 인수와 비교합니다 x. 따라서 비어 있거나 제공되지 않은 경우 [명령은 true를 반환합니다.$1

[ $1 = "" ]

zsh목록 컨텍스트에서 빈 변수가 참조되지 않으면 빈 인수 대신 인수가 전혀 없는 것으로 확장되므로 명령은 $1설정되지 않았거나 비어 있는 경우 에만 인수로 수신되기 때문에 작동하지 않습니다 . 빈 문자열 이해했습니다. 아니면 POSIX 쉘과 같습니다.[[=][ -z "$1" ][ "$1" = "" ]

Bourne과 같은/POSIX 쉘에서는 [ x$1 = x ]이는 의미가 없습니다. 이는 스크립트의 첫 번째 인수에 어떤 방식으로든 적용된 분할+glob 연산자를 연결한 것으로 x, 결과와 =, x및 가 명령에 대한 유효한 테스트 표현식을 ]구성하기를 바랍니다.[

예를 들어, 스크립트에 " = x -o x ="매개변수가 전달되면 , , , , , , , , , , , , , , , 과 [같은 매개변수를 받게 되며, 이는 및 와 비교 하여 true를 반환하는 것으로 이해됩니다 .[x=x-ox=x][xxxx

이면 쉘은 이름이 (glob 확장 ) 로 시작하는 현재 디렉토리의 파일 목록 과 숨기지 않은 파일 목록(확장 ) $1을 명령에 전달 합니다 ... 이는 말이 되지 않습니다. . 의미가 있는 유일한 경우는 와일드카드나 공백 문자가 포함되지 않은 경우입니다."* *"[xx**[$1

이제 때때로 다음과 같은 코드를 찾을 수 있습니다.

[ "x$1" = x ]

$1비어 있는지 또는 설정되지 않았는지 테스트하는 데 사용됩니다 .

비어 있거나 설정되지 않은 변수를 테스트하는 일반적인 방법은 다음과 같습니다.

[ -z "$1" ]

그러나 일부 (POSIX가 아닌) 구현의 일부 값 $1(예: Solaris 10 및 이전 Bourne 쉘의 내장 값) 또는 일부 이전 버전(최대 0.5.4) 또는 일부 BSD의 경우, 그 방법은 실패할 것이다.=[/bin/shdashsh

이는 , , 및 가 문자열 에 적용되는 단항 연산자 로 이해되기보다는 이항 연산자에 대한 인수 누락 에 대해 불평하는 [것으로 보이기 때문입니다.[-z=]=-z=

마찬가지로 [ "$1" = "" ]if의 일부 구현은 실패합니다.[$1!(

이러한 쉘/ [구현에서:

[ "x$1" = x ]

값에 관계없이 항상 유효한 테스트이므로 $1다음과 같습니다.

[ "" = "$1" ]

그리고:

[ -z "${1:+x}" ]

그리고

case $1 in "") ...; esac

물론 인수가 제공되지 않았는지 확인하려면 다음을 수행할 수 있습니다.

[ "$#" -eq 0 ]

즉, 스크립트에 전달된 인수 수를 확인합니다.

요즘은 [ -z "$var" ]POSIX에서 명시적으로 지정하고 적합성 구현에 실패하지 않습니다 [(그리고 수십 년 동안 그래 bash왔습니다 [). 따라서 bashPOSIX sh 또는 스크립트에서 이를 사용할 수 있어야 합니다 .

답변4

[ x$1 = x ]$1설정되지 않았거나 null이거나 비어 있으면 참입니다.
시도해 보세요:
TEST= ;[ x$TEST = x] && echo "TEST is unset"
그리고
TEST=lolz ;[ x$TEST = x ] && echo "TEST is unset"

관련 정보