함수 호출자 위치 매개변수

함수 호출자 위치 매개변수

$@함수 호출자의 위치 매개변수를 읽고 써야 합니다 . Bash 매뉴얼 페이지는 다음과 같이 말합니다.

쉘 함수는 간단한 명령처럼 호출되고 새로운 위치 인수 세트를 사용하여 복합 명령을 실행하는 객체입니다.

따라서 $@호출될 때마다 다시 작성됩니다. 몇 가지 "특수 매개변수"를 찾았지만 아무것도 찾지 못했습니다. 쉘 변수가 BASH_ARGV내 문제를 해결하는 것 같지만 shopt -s extdebug활성화해야 합니다. 이는 내 컴퓨터의 기본 동작이 아니며 프로덕션에서 활성화된 옵션도 아닙니다.

extdebug
    If set, behavior intended for use by debuggers is enabled:
    ...
    4.     BASH_ARGC and BASH_ARGV are updated as described in their
           descriptions above.
    ...

$@Bash는 함수를 사용하지 않고도 함수 호출자에게 읽거나 쓸 수 있습니까 BASH_ARGV? Bash가 제한되어 있고 스크립팅을 위해 다른 쉘을 사용한다고 생각하십니까?

편집하다:getopt내 도우미 라이브러리에 멋진 래퍼를 갖고 싶습니다 . 따라서 이와 관련된 모든 동작은 함수 내부에 있습니다. 오류나 set --.

답변1

함수는 호출자의 위치 매개변수에 영향을 미칠 수 없습니다. 이는 의도적으로 설계된 것입니다. 위치 매개변수는 해당 함수에만 적용됩니다.

함수가 배열에서 작동하도록 만드세요.

myfunction () {
  local _myfunction_arrayname=$1
  shift
  … # work on the positional parameters
  eval "$_myfunction_arrayname=(\"\$@\")"
}
myfunction foo "$@"
set -- "${foo[@]}"

.ksh93과 bash에는 별칭과 ( ) 내장 함수를 프로세스 대체와 source결합하여 무언가를 달성하는 우회적인 방법이 있습니다 ..

alias myfunction='. <(echo myfunction_body \"\$@\"; echo set -- "\"\${new_positional_parameters[@]}\"")'

함수의 주요 작업을 넣고 myfunction_body배열을 설정하도록 합니다 new_positional_parameters. 호출 후 위치 매개변수는 myfunction입력된 값으로 설정됩니다.myfunction_bodynew_positional_parameters

답변2

여기 몇 가지가 있습니다매개변수를 반복하면서 필요에 따라 각 매개변수를 업데이트하는 코드. 이 경우 반복되는 슬래시를 단일 슬래시로 바꾸십시오.

for param
do
    param="$(printf %s. "$1" | tr -s "/")"
    set -- "$@" "${param%.}"
    shift
done

관련 정보