다음을 찾았으며 설명서를 어디서 찾을 수 있는지 알고 싶습니다.
❯ 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}
값의 길이입니다범위, 그래서 언제$#
is1
(또는0
등),${##}
is1
, 그리고 언제 isfoo=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 텍스트에는 멋진 테이블이 있습니다., 하지만.
#
여기서 , ?
및 가 서로 다른 두 가지 의미를 갖는다 는 사실은 -
우연의 일치이거나 제한된 특수 문자 세트와 쉘에서 사용하는 다소 간결한 구문의 결과입니다.