왜 ${#}, ${##}는 1이고, ${?}, ${??} 및 ${!}는 0이고, ${-}는 569JNORXZghiklms입니다.

왜 ${#}, ${##}는 1이고, ${?}, ${??} 및 ${!}는 0이고, ${-}는 569JNORXZghiklms입니다.

다음을 찾았으며 설명서를 어디서 찾을 수 있는지 알고 싶습니다.

❯ echo ${#}
1

❯ echo ${##}
1

❯ echo ${?}
0

❯ echo ${??}
0

❯ echo ${!}
0

❯ echo ${-}
569JNORXZghiklms

❯ echo ${--}
569JNORXZghiklms

답변1

적어도 Bash 매뉴얼에는 두 가지 차이점이 있습니다. 이는 표준 기능이어야 하며 모든 셸에서 유사해야 합니다. 비록 ${-}여기의 실제 값이 Zsh에서 나온 것처럼 보이더라도 말입니다.

$ echo ${#}
1
$ echo ${?}
0
$ echo ${!}
0
$ echo ${-}
569JNORXZghiklms

이것들은특수 매개변수 #, ?및 , !-선택적 중괄호를 사용하여 확장됩니다. $#, $?, $!또는$- 동일하게 사용하세요 . "이름"으로 영숫자가 아닌 단일 문자를 갖는 다른 특수 매개변수가 있습니다. 일반적 ${foo}으로 와 동일 $foo하지만 유사한 경우에는 로 처리되므로 중괄호가 ${foo}bar필요 $foobar합니다 ${foobar}.

특히,

  • $#스크립트나 현재 함수에 대한 위치 인수 또는 인수 수입니다. 노력하다 fun() { echo $#; }; fun a b c;.

  • $?마지막 포그라운드 명령 또는 파이프( )의 종료 상태입니다 ls -l /doesnotexist; echo $?.

  • $!최신 백그라운드 작업인 경우 프로세스 ID( sleep 2 & ps uax |grep $!) 및

  • $-목록set배너효율적인. ( Zsh의 일부 플래그. Zsh도 그러한 작업이 없는 것처럼 setopt보이며 Bash는 이를 설정되지 않은 것으로 표시합니다.)$!0

$ echo ${##}
1
$ echo ${??}
0
$ echo ${--}
569JNORXZghiklms

특수 매개변수 #, ?-가 있지만 추가 매개변수도 있습니다.매개변수 확장작업이 포함됩니다. (무엇이라고 불러야할지 모르겠습니다. 매개변수 확장의 일부일 뿐입니다.)

  • ${#parameter}값의 길이입니다범위, 그래서 언제 $#is 1(또는 0등), ${##}is 1, 그리고 언제 is foo=abc, ${#foo}is 입니다 3.

    (다소 관련이 있으므로 ${parameter#word}접두사를 제거하면범위부팅 부분 일치단어제거되었습니다(예: 임의의 한 문자와 일치 하므로 foo=abcdef; echo ${foo#??}제공됨 ). 특별한 경우는 길이를 얻거나 빈 접두사를 제거하는 것으로 해석될 수 있지만 여기서는 길이 확장이 우선합니다. 동일하지만 후행 부분을 제거합니다. )cdef?${##}${parameter%word}

  • ${parameter?word}값을 제공하는 "설정된 경우 확인" 확장입니다.범위설정하면 그렇지 않으면 오류가 발생하고 아래 텍스트가 표시됩니다.단어. $?항상 설정되어 있으므로 확인하는 것은 별로 어렵지 않지만 시도해 보십시오 unset foo; echo ${foo?unset value\!}.

  • ${parameter-word}값이 다음과 같은 "기본" 확장입니다.범위다르게 설정하면단어. $-항상 설정되어 있으므로 그 값을 얻을 수 있습니다. 하지만 foo설정하지 않으면 ${foo-bar}가 됩니다 bar.

마지막 두 개와 그와 유사한 다른 것들은 콜론이 있는 변형을 가지고 ${parameter:?word}있으며 ${parameter:?word}아래에서도 트리거됩니다.범위빈 문자열로 설정합니다. Bash의 매뉴얼은 여기서 더 명확할 수 있습니다. 텍스트의 차이점을 언급하지만 콜론 없이 양식을 나열하지는 않습니다. 이것POSIX 텍스트에는 멋진 테이블이 있습니다., 하지만.


#여기서 , ?및 가 서로 다른 두 가지 의미를 갖는다 는 사실은 -우연의 일치이거나 제한된 특수 문자 세트와 쉘에서 사용하는 다소 간결한 구문의 결과입니다.

관련 정보