$@
함수 호출자의 위치 매개변수를 읽고 써야 합니다 . 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_body
new_positional_parameters
답변2
여기 몇 가지가 있습니다매개변수를 반복하면서 필요에 따라 각 매개변수를 업데이트하는 코드. 이 경우 반복되는 슬래시를 단일 슬래시로 바꾸십시오.
for param
do
param="$(printf %s. "$1" | tr -s "/")"
set -- "$@" "${param%.}"
shift
done