[ -n ]이 [ -n "" ]처럼 false가 아닌 이유는 무엇입니까?

[ -n ]이 [ -n "" ]처럼 false가 아닌 이유는 무엇입니까?

내 질문은 이 코드에서 생성된 반환 값에 관한 것입니다.

if [ -n ]; then echo "true"; else echo "false"; fi

이 인쇄됩니다 true.

보충 테스트에서도 [ -z ]인쇄를 사용합니다 true.

if [ -z ]; then echo "true"; else  echo "false"; fi

위 코드에서 [ -n ]테스트에서는 전달된 문자열 값이 전혀 null이 아니라고 가정하는 이유는 무엇입니까?

아래 코드는 를 인쇄합니다 false. 이는 전달된 문자열 값이 비어 있고 길이가 0이기 때문에 예상됩니다.

if [ -n "" ]; then echo "true"; else  echo "false"; fi

답변1

[ -n ]테스트를 사용하지 마십시오 -n.

-nin은 [ -n ]전혀 테스트가 아닙니다. [및 사이에 인수가 하나만 있는 경우 ]해당 인수는 문자열이며 비어 있는지 테스트됩니다.문자열에 선행이 있더라도 -여전히 테스트가 아닌 피연산자로 해석됩니다.문자열 -n은 비어 있지 않으므로 두 개의 문자가 포함되어 있습니다 -.n아니요0자 - [ -n ]true로 평가됩니다.

~처럼이그나시오 바스케스 아브람스 라고, 어디string매개변수이고 테스트는 다음에서 실행됩니다.stringin은 그에 대해 수행된 테스트와 동일합니다. 언제[ string ][ -n string ]string공교롭게도 -n특별한 일은 일어나지 않습니다. in과 두 번째 in은 비어 있는지 테스트하는 문자열입니다 -n.[ -n ]-n[ -n -n ]

[and 사이에 인수가 하나만 있는 경우 ]해당 인수는 테스트와 동일한 이름이 지정된 경우에도 항상 비어 있지 않은지 테스트할 문자열입니다. 마찬가지로, 와 그 중 첫 번째 인수 사이에 두 개의 인수가 있는 경우 [두 번째 인수는 테스트와 동일한 이름이 지정된 경우에도 항상 비어 있지 않은지 테스트할 문자열입니다. 이는 for 구문이 및 또는 그 이후의 단일 인수가 문자열 피연산자라고 주장하기 때문입니다.]-n[[]-n

같은 이유로 테스트를 [ -n ]사용하지 마세요 . 테스트를 사용하지 마세요 .-n[ -z ]-z


도움말을 보면 에 대해 [자세히 알아볼 수 있습니다. bash이는내장 케이스:

$ type [
[ is a shell builtin

따라서 help [다음을 실행하여 도움을 받을 수 있습니다.

$ help [
[: [ arg... ]
    Evaluate conditional expression.

    This is a synonym for the "test" builtin, but the last argument must
    be a literal `]', to match the opening `['.

지원되는 테스트와 작동 방식을 포함한 자세한 내용은 의 도움말을 확인해야 합니다 test. 명령을 실행하면 help test자세한 목록이 표시됩니다. 다음은 문자열 연산자에 대한 부분입니다. 이를 모두 재현하는 것이 아닙니다.

      -z STRING      True if string is empty.

      -n STRING
         STRING      True if string is not empty.

      STRING1 = STRING2
                     True if the strings are equal.
      STRING1 != STRING2
                     True if the strings are not equal.
      STRING1 < STRING2
                     True if STRING1 sorts before STRING2 lexicographically.
      STRING1 > STRING2
                     True if STRING1 sorts after STRING2 lexicographically.

-n STRING동일한 작업 을 수행하십시오 . STRING문자열이 STRING비어 있지 않은지 테스트합니다.

답변2

[엑스]동등하다[ -n엑스]~ 일지라도엑스-피연산자가 없으면 처음부터 시작합니다.

$ [ -o ] ; echo $?
0
$ [ -eq ] ; echo $?
0
$ [ -n -o ] ; echo $?
0
$ [ -n -eq ] ; echo $?
0

답변3

[ -n ][명령(또는 test명령)이 다음에 따라 실행되기 때문에 사실입니다.숫자주어진 인수. 인수가 하나만 주어지고 인수가 비어 있지 않은 문자열인 경우 결과는 "true"입니다. "-n"은 비어 있지 않은 2자 문자열이므로 "true"입니다.

관련 정보