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 test
type test
man 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
-o
x
=
x
]
[
x
x
x
x
이면 쉘은 이름이 (glob 확장 ) 로 시작하는 현재 디렉토리의 파일 목록 과 숨기지 않은 파일 목록(확장 ) $1
을 명령에 전달 합니다 ... 이는 말이 되지 않습니다. . 의미가 있는 유일한 경우는 와일드카드나 공백 문자가 포함되지 않은 경우입니다."* *"
[
x
x*
*
[
$1
이제 때때로 다음과 같은 코드를 찾을 수 있습니다.
[ "x$1" = x ]
$1
비어 있는지 또는 설정되지 않았는지 테스트하는 데 사용됩니다 .
비어 있거나 설정되지 않은 변수를 테스트하는 일반적인 방법은 다음과 같습니다.
[ -z "$1" ]
그러나 일부 (POSIX가 아닌) 구현의 일부 값 $1
(예: Solaris 10 및 이전 Bourne 쉘의 내장 값) 또는 일부 이전 버전(최대 0.5.4) 또는 일부 BSD의 경우, 그 방법은 실패할 것이다.=
[
/bin/sh
dash
sh
이는 , , 및 가 문자열 에 적용되는 단항 연산자 로 이해되기보다는 이항 연산자에 대한 인수 누락 에 대해 불평하는 [
것으로 보이기 때문입니다.[
-z
=
]
=
-z
=
마찬가지로 [ "$1" = "" ]
if의 일부 구현은 실패합니다.[
$1
!
(
이러한 쉘/ [
구현에서:
[ "x$1" = x ]
값에 관계없이 항상 유효한 테스트이므로 $1
다음과 같습니다.
[ "" = "$1" ]
그리고:
[ -z "${1:+x}" ]
그리고
case $1 in "") ...; esac
물론 인수가 제공되지 않았는지 확인하려면 다음을 수행할 수 있습니다.
[ "$#" -eq 0 ]
즉, 스크립트에 전달된 인수 수를 확인합니다.
요즘은 [ -z "$var" ]
POSIX에서 명시적으로 지정하고 적합성 구현에 실패하지 않습니다 [
(그리고 수십 년 동안 그래 bash
왔습니다 [
). 따라서 bash
POSIX sh 또는 스크립트에서 이를 사용할 수 있어야 합니다 .
답변4
[ x$1 = x ]
$1
설정되지 않았거나 null이거나 비어 있으면 참입니다.
시도해 보세요:
TEST= ;[ x$TEST = x] && echo "TEST is unset"
그리고
TEST=lolz ;[ x$TEST = x ] && echo "TEST is unset"