if 명령의 조건 테스트

if 명령의 조건 테스트

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 trueif falseif any_command[truefalseany_commandif

[내장되어 있고 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-zSTRING-n-z

[ -n STRING ]스니펫이 또는 으로 작동하도록 하려면 [ -z STRING ]변수를 큰따옴표로 묶어야 합니다. 확장 후 쉘은 [ -z "$rizwan" ]정확하게 전달됩니다.에 대한 인수 [. 이는 -z변수의 확장된 값(빈 문자열이더라도) 및 입니다 ]. 이 도구는 원하는 모든 인수를 가져옵니다.

예에서 인용되지 않은 단어가 $rizwan두 개 이상의 단어로 확장되면 [세 개 이상의 인수를 얻게 됩니다. 일반적으로 최종 결과는 변수 내용과 구현에 따라 달라집니다 [.

비교하다쉘 스크립트가 공백이나 기타 특수 문자로 인해 막히는 이유는 무엇입니까?.

Bash의 메모 [[는 다릅니다. 이는 키워드이고 쉘 파서와 통합되어 있으며 일부 규칙을 변경하고 실제로 [[및 사이의 변수와 따옴표를 인식합니다 ]]. [[대신 을 사용하면 [(결과적으로 대신 ]]대신 ]) 코드가 예상대로 작동합니다. 보다이 답변.

[휴대용이다.

답변2

변수가 rizwan비어 있으므로 if명령은 다음과 같습니다.

if [ -n  ]

구문 [ STRING ]은 문자열이 비어 있는지(문자 없음) 테스트합니다. 따라서 귀하의 경우 [ -n ]문자열 -n은 분명히 비어 있지 않습니다.

관련 정보