빈 문자열과 요소가 0개인 목록은 어떻게 다르게 동작하나요?

빈 문자열과 요소가 0개인 목록은 어떻게 다르게 동작하나요?

~에서https://unix.stackexchange.com/a/94200/674

위치 인수가 없으면($#은 0) "$@"는 다음으로 확장됩니다.아무것도 없다(아니요빈 문자열, 하지만0개 요소를 포함하는 목록)

그렇다면 빈 문자열은 요소가 0개인 목록과 어떻게 다르게 동작할까요?

"0개의 요소를 포함하는 목록"은 "0개의 요소를 포함하는 배열"을 의미합니까? 나는 bash에 개념이 없다고 생각합니다 list.

"없음"이 반드시 "목록"이나 배열이 아닌 것을 의미할 수 있나요?

답변1

예, 대부분의 쉘에는 목록(변수용) 개념이 없습니다.
이는 정의된 콘텐츠 유형(문자열 또는 숫자와 별개)이 아닙니다.

그러나 명령의 인수는 목록입니다.

이것은 매우 특별한 데이터 유형으로, 목록으로만 표현됩니다 "$*". "$@"그러나 차이점이 있습니다.

$ set -- one two t33
$ printf '<%s> ' "$*" ; echo
<one two t33>

$ printf '<%s> ' "$@" ; echo
<one> <two> <t33>

$ for s; do printf '<%s>' "$s" ; done; echo
<one><two><t33>

설명 후, 인용문은 요소가 0개인 매개변수 목록이 요소가 없는 목록과 동일하다는 것을 의미합니다.

  • 즉, 목록이 사라집니다(인쇄할 요소가 없음).

    $ set -- 
    $ echo $#
    0
    
    $ printf '<%s>' "$@" ; echo
    <>
    
    $ for s in "$*"; do echo "<a>" ; done
    <a>
    
    $ for s in "$@"; do echo "<a>" ; done
    $
    

최종 코드는 "빈"(널) 문자열도 아닌 "아무것도" 인쇄하지 않습니다.

귀하의 질문에 관해서 :

"없음"이 반드시 "목록"이나 배열이 아닌 것을 의미할 수 있나요?

아무것도 아님"(빈) "목록"이어야 합니다. 그러나 "빈 문자열"이 존재합니다.

답변2

기본적으로 $#몇 가지 매개변수가 제공됩니다. 0은 숫자이기도 하며, 매개변수가 제공되지 않았음을 나타냅니다. $@그러나 확장이 비어 있으므로 평가할 수 없습니다. (예: 매개변수가 있는지 확인) 스크립트에서 직접 시도해보고 어떻게 작동하는지 확인하세요.

제공된 인수 수를 확인하려는 경우(예: 스크립트에서 계산)필수 매개변수 3개제안 - 당신은 할 것입니다 $#.

실제로 매개변수를 사용하여 작업을 수행해야 하는 경우 를 사용합니다 $@.

다음 예를 참조하세요.TLDP 내부 변수

관련 정보