echo
두 시나리오 모두에서 명령문이 실행되는 이유를 아시나요 ?
출력 it worked
:
#!/bin/bash
rizwan=''
if [ -n $rizwan ]; then
echo "it worked"
fi
-n
으로 바꾸면 출력이 없을 것으로 예상되는 경우 -z
출력됩니다 it worked
.
#!/bin/bash
rizwan=''
if [ -z $rizwan ]; then
echo "it worked"
fi
답변1
당신이 알 수도 있고 아닐 수도 있지만 명확하게 해두자: 구문 [
의 일부가 아닙니다 if
. 내 말 은 , 또는 if [ …
처럼 동작한다는 뜻입니다 . 여기서 , 및 은 명령입니다. 종료 상태를 반환하며 이것이 중요합니다 .if true
if false
if any_command
[
true
false
any_command
if
[
내장되어 있고 Bash에 있더라도 일반 명령처럼 작동합니다 . POSIX에서 필요하기 때문에 독립 [
실행형 실행 파일(예: ) 도 있습니다 ./usr/bin/[
이는 인수가 거의 없는 명령 [ -n whatever ]
일 뿐이라는 의미 입니다. [
예, ]
단지 인수일 뿐이며 구분 기호나 그와 유사한 것이 아닙니다. 명명된 명령은 마지막 인수 [
만 있으면 됩니다 . ]
이렇게 하면 코드가 더 읽기 쉽고 ]
다른 용도로 사용되지 않습니다.
명령은 test
와 동일합니다 [
. 유일한 차이점은 test
필요하지 않다는 것 입니다 ]
.
[ -n whatever ]
와 같습니다 test -n whatever
.
셸이 $rizwan
빈 문자열로 확장되면 조각 [ -n $rizwan ]
과 조각은 각각 및 [ -z $rizwan ]
가 됩니다 . 명령은 (또는 ) 사이에 무언가가 있다는 것을 인식하지 못하며 코드에서 정확히 두 개의 인수를 얻습니다. 두 테스트 모두 가 또는 인 구문 으로 처리됩니다 . 이 구문은 비어 있지 않은지 테스트합니다. 빈 문자열도 아니고 빈 문자열 도 아니기 때문에 테스트는 항상 성공합니다 .[ -n ]
[ -z ]
[
-n
-z
]
[ STRING ]
STRING
-n
-z
STRING
-n
-z
[ -n STRING ]
스니펫이 또는 으로 작동하도록 하려면 [ -z STRING ]
변수를 큰따옴표로 묶어야 합니다. 확장 후 쉘은 [ -z "$rizwan" ]
정확하게 전달됩니다.삼에 대한 인수 [
. 이는 -z
변수의 확장된 값(빈 문자열이더라도) 및 입니다 ]
. 이 도구는 원하는 모든 인수를 가져옵니다.
예에서 인용되지 않은 단어가 $rizwan
두 개 이상의 단어로 확장되면 [
세 개 이상의 인수를 얻게 됩니다. 일반적으로 최종 결과는 변수 내용과 구현에 따라 달라집니다 [
.
비교하다쉘 스크립트가 공백이나 기타 특수 문자로 인해 막히는 이유는 무엇입니까?.
Bash의 메모 [[
는 다릅니다. 이는 키워드이고 쉘 파서와 통합되어 있으며 일부 규칙을 변경하고 실제로 [[
및 사이의 변수와 따옴표를 인식합니다 ]]
. [[
대신 을 사용하면 [
(결과적으로 대신 ]]
대신 ]
) 코드가 예상대로 작동합니다. 보다이 답변.
[
휴대용이다.
답변2
변수가 rizwan
비어 있으므로 if
명령은 다음과 같습니다.
if [ -n ]
구문 [ STRING ]
은 문자열이 비어 있는지(문자 없음) 테스트합니다. 따라서 귀하의 경우 [ -n ]
문자열 -n
은 분명히 비어 있지 않습니다.