답변:
그 수표 $1
가 (동일 인용해야하지만, 비어 [ -z "$1" ]
). 아주 오래된 쉘은 빈 문자열을 제대로 처리하지 못했기 때문에 휴대용 스크립트 작성자는 이러한 스타일의 검사를 채택했습니다. 수십 년 동안 필요하지 않았지만 사람들은 여전히 그렇게하므로 사람들은 여전히 그렇게합니다.
[ x$1 = x ]
여전히 잘못이지만, [ "x$1" = x ]
문제가 껍질이 될 것 $1
입니다 !
또는 (
또는를 -n
.... [ "" = "$1" ]
하고 case $1 in "")
도 OK하지만 것입니다.
[ -z "$1" ]
그리고 [ "$1" = "" ]
여전히 dash-0.5.4를 사용하는 Solaris 10의 / bin / sh에서는 작동하지 않습니다.
[ "$1" = "" ]
여전히 작동하지 않습니다 /bin/sh
(여기서는 사용하고 싶지는 /usr/xpg4/bin/sh
않지만 /bin/sh
). 대시는 2009 년 1 월에 이와 관련하여 수정되었습니다.
대괄호는 표시 테스트를 그렇게 [ 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
는 왼쪽이 아무것도 확장되지 않기 때문에 구문 오류입니다.
if [ = x ] # No good!
if [ "" = "" ] # Okay.
if [ x = x ] # Also okay.
1. 실제로 test
독립형 유틸리티 일 수 있지만 대부분의 쉘은이를 내장형으로 구현합니다. 차이 확인 which test
및 type test
. GNU / 리눅스에 man test
주장을 참조하기 위해 내장,하지만 당신은 호출하는 경우 (예를 들어) /usr/bin/test
, 그 유틸리티가 포함 매뉴얼 페이지에 설명 된 기능을 구현하는 것 -z
하고 -n
.
[ x$1 = x ]
$1
예를 들어 이면 true로 평가됩니다 " -o x"
. 시도하십시오 sh -xc '[ x$1 = x ] && echo yes' sh ' -o x'
. [ x$1 = x ]
잘못되어 이해가되지 않습니다.
if
사용 test
이전에 그것을 사용할 수 있습니다 &&
, ||
또는 후 while
또는 사용하여 결과를 검토$?
[ x$1 = x ]
에서만 의미가 zsh
있습니다. 이는 x
스크립트의 첫 번째 인수와 의 연결을와 비교합니다 x
. 따라서 [
명령 $1
이 비어 있거나 제공되지 않으면 true를 리턴합니다 .
[ $1 = "" ]
에, 때문에 작동하지 않을 것입니다 zsh
비어있는 변수 목록 맥락에서 인용되지 않을 때, 그렇게하면 대신 빈 인수의 전혀 인수로 확장 $1
해제 또는 비어 있었다의 [
명령은 인수로받을 [
, =
빈 문자열 그리고 ]
그것은 이해할 수 없었습니다. [ -z "$1" ]
또는 [ "$1" = "" ]
POSIX 쉘에서와 같이 괜찮을 것입니다.
Bourne-like / POSIX 쉘에서는 [ x$1 = x ]
의미가 없습니다. 즉 어떻게 든의 연결에 적용되는 분할 + 글로브 운영자 x
와 결과 및 바라고 스크립트의 첫 번째 인수 =
하고 x
, 그리고 ]
에 대한 유효한 테스트 표현식 구성 [
명령을 사용합니다.
스크립트가 하나 개 전달 된 경우 예를 들어, " = x -o x ="
인수를 [
그 인수를받을 것이다 : [
, x
, =
, x
, -o
, x
, =
, x
, ]
, 어떤 [
비교로 이해할 x
와 x
와 x
와 x
와 true를 돌려줍니다.
경우 $1
였다 "* *"
, 다음 쉘은에 전달할 것 [
그 이름을 시작으로 현재 디렉토리에 명령 파일 목록을 x
(의 글로브 확장 x*
) 비 숨겨진 파일 (확장, 다음 목록 *
) ... [
할 수 없을 수도 있습니다 어떤 의미에서 말입니다. $1
와일드 카드 나 공백 문자가 포함되지 않은 경우에 합리적 일 수 있습니다.
이제는 때때로 다음과 같은 코드를 찾습니다.
[ "x$1" = x ]
$1
비어 있거나 설정되어 있지 않은지 테스트하는 데 사용됩니다 .
비어 있거나 설정되지 않은 변수를 테스트하는 일반적인 방법은 다음과 같습니다.
[ -z "$1" ]
그러나 이것은 Solaris 10 및 이전 또는 이전 버전 (최대 0.5.4) 또는 일부 BSD 에서와 같이 Bourne 쉘의 내장 된 것과 같은 일부 POSIX가 아닌 구현 에서 $1
와 같은 일부 값에 대해서는 실패합니다 .=
[
/bin/sh
dash
sh
그 때문입니다 [
보고 [
, -z
, =
, ]
과에 인수 누락에 대해 불평 =
이항 연산자 대신으로 이해 -z
단항 연산자가 적용 =
문자열입니다.
유사하게, [ "$1" = "" ]
일부 구현에 실패 [
하는 경우 $1
이다 !
나 (
.
해당 쉘 / [
구현에서 :
[ "x$1" = x ]
의 값에 관계없이 항상 유효한 테스트 $1
이므로 다음과 같습니다.
[ "" = "$1" ]
과:
[ -z "${1:+x}" ]
과
case $1 in "") ...; esac
물론, 인수가 제공되지 않았는지 확인하려면 다음을 수행하십시오.
[ "$#" -eq 0 ]
즉, 스크립트에 전달 된 인수 수를 확인합니다.
요즘, 참고 [ -z "$var" ]
명확하게 POSIX에 의해 지정되고 준수에 실패 할 수 없습니다 [
구현 (와 bash
의이 [
이며, 수십 년 동안이었다). 따라서 POSIX sh 또는 bash
스크립트 에서이를 사용할 수 있어야합니다 .
x$1
두 문자열 연접된다 x
와 $1
그리고 $ 1 비어 있다면 $ 1 x는 X와 동일하고 [$ X 1 = X 그 결과에 해당 될 것이다. x = y
sh에서 문자열을 비교하는 데 사용됩니다.
x$1
, 인용 분할 있도록 글 로빙은 이들에 수행되지 않습니다.
[ x$1 = x ]
$1
설정되지 않았거나 null이거나 비어 있으면 true 입니다.
자신과 시도 :
TEST= ;[ x$TEST = x] && echo "TEST is unset"
및
TEST=lolz ;[ x$TEST = x ] && echo "TEST is unset"
[ x$1 = x ]
$1
예를 들어있는 경우에도 마찬가지 " -o x"
입니다. 시도하십시오 sh -xc '[ x$1 = x ] && echo yes' sh ' -o x'
. [ x$1 = x ]
잘못되어 이해가되지 않습니다.