쉘 함수에 너무 적은 인수를 전달하면 어떻게 됩니까?

쉘 함수에 너무 적은 인수를 전달하면 어떻게 됩니까?

함수에 매개변수를 전달하는 것에 대해 질문하고 싶습니다. 나는 이것을 시도했습니다 :

function_name $var1 $var2

하지만 일반적으로(가끔 인쇄 오류가 발생하는 경우) 합격 여부는 별 차이가 없습니다. 그냥 호출하면 완벽하게 작동한다는 뜻입니다 function_name. 그래서 내 질문은: 위의 예와 같이 이러한 매개변수를 제공해야 합니까?

답변1

C에는 프로토타입이 없기 때문에 Bash는 함수에 전달된 인수 수를 확인하지 않습니다.https://www.gnu.org/software/bash/manual/bash.html#Shell-Functions:

셸 함수는 그룹의 단일 이름을 사용하여 나중에 실행할 수 있도록 명령을 그룹화하는 방법입니다. 이는 "일반" 명령처럼 실행됩니다. 쉘 함수의 이름을 단순 명령 이름으로 사용하는 경우에는 해당 함수 이름과 연관된 명령 목록이 실행됩니다. 셸 기능은 현재 셸의 컨텍스트에서 실행되며 이를 해석하기 위한 새 프로세스가 생성되지 않습니다.

함수를 선언하려면 다음 구문을 사용하십시오.

name () 복합 명령 [리디렉션]

또는

함수명[()] 복합명령어 [리디렉션]

한 가지 접근 방식은 함수 내의 여러 매개변수가 올바른지 확인하고 그렇지 않은 경우 오류를 반환하는 것입니다. 그러나 이는 Bash의 책임이 아닙니다. 바라보다:

#!/bin/bash

function f()
{
    echo $1
}

function f1
{
    echo $1
}

f
f 2
f1
f1 f1

답변2

함수가 호출될 때 명령줄에 나타나는 순서대로 함수의 인수를 숫자 확장으로 참조할 수 있습니다. 함수를 실행하기 위해 매개변수가 필요하도록 하려면 매개변수 확장을 통해 관련 매개변수에 대한 내장 실패 참조를 만들어 이를 달성할 수 있습니다.

echo1()(
    printf %s\\n \
    "${1?This function requires an argument!}"
)

위의 값은 인쇄됩니다(그렇다면)함수의 첫 번째 매개변수의 경우 stdout의 개행 문자를 따르고 0을 반환합니다. 그렇지 않으면 다음 구문을 포함하는 셸 형식으로 진단 메시지를 인쇄합니다.이 함수에는 하나의 매개변수가 필요합니다!stderr로 변환하고 인수가 전혀 제공되지 않으면 0이 아닌 값을 반환합니다.

함수는 서브셸에서 실행되도록 선언되었습니다. 예를 들면 다음과 같습니다.

fn()( : body )

예를 들어 현재 셸이 아닌 다음과 같습니다.

fn(){ : body; }

이는 오류를 발생시키는 데 사용되는 매개변수 대체 형식으로 인해 현재 셸이 종료되기 때문입니다. 이로 인해 현재 셸에서 함수가 실행되는 경우 현재 셸이 예기치 않게 종료될 수 있습니다. 이는 다음에만 적용됩니다.비대화형그러나 껍질. 예를 들어, 위 함수는 함수가 서브셸에서 선언되었는지 여부에 관계없이 프롬프트에서 호출되는 경우 유사하게 작동해야 합니다.

echo1그러나 현재 셸에서 함수를 선언하고 스크립트에서 실행하는 경우 매개 변수 없이 스크립트를 호출하면 스크립트 실행이 완전히 종료됩니다.

답변3

함수는 매개변수 목록을 수신하는 외부 명령과 같습니다. 본질적으로 특정 수의 인수가 필요한 함수를 정의할 방법이 없습니다. 함수의 코드는 인수 수와 해당 값을 확인하고 필요한 경우 오류 메시지를 내보낼 수 있습니다.

현재 함수에 전달된 인수의 수는 특수 변수에서 사용할 수 있습니다 $#. 실제 매개변수 개수보다 큰 번호가 매겨진 매개변수를 사용하면 매개변수가 설정 해제되므로 해당 매개변수에 액세스하려고 하면 빈 문자열이 표시됩니다. 예를 들어 다음과 같은 정의를 사용합니다.

f () {
  echo "$#" "[[$2]]"
}
  • f인쇄 0 [[]]. 2번 매개변수가 없으므로 $2빈 문자열로 확장됩니다.
  • f onePrint 1 [[]]같은 이유로.
  • f one two인쇄 2 [[two]].
  • f one two three인쇄 3 [[two]]. 함수는 세 번째 인수로 아무 작업도 수행하지 않지만 괜찮습니다.

관련 정보