Bash : 위치 매개 변수 조각

먼저 복사하지 않고 Bash에서 $@ 조각을 가져 오려면 어떻게해야합니까? 모든 위치 매개 변수를 이와 같은 다른 배열에 추가 하시겠습니까?

argv=( "$@" ) echo "${argv[@]:2}"; 

주석

  • 항상 인용 "$@". 인수에 공백이 있으면 argv 할당이 중단됩니다.

Answer

다른 어레이와 동일한 형식을 사용할 수 있습니다. $@에서 두 번째 및 세 번째 요소를 추출하려면 다음을 수행하십시오.

echo "${@:1:2}" - - | |----> slice length |------> slice starting index 

댓글

  • 하지만 이것은 v4.1.2에서 문자 단위로 작동하는 것 같습니다. 단어 단위로 수행하는 방법이 있습니까?
  • @AlexejMagura I 당신이 의미하는 바를 ' 이해하지 마십시오. 그것은 배열의 요소에 작용합니다. 한 문자 요소가있는 경우 " 문자 "에서 작동합니다. 각 요소가 단어이면 단어에 적용됩니다. 배열이 아닌 문자열에서 시도하고 있습니까?
  • ' " $ @ ", 그 시점에서 문자열이 될 수 있지만 ' 확실하지 않습니다.
  • bash 4.2.46에서 "${@:1:2}"는 실제로 1st 2nd 명령 줄 인수 . 한편 "${@:1}" 전체 명령 줄 인수 를 제공하고 "${@:0}" 스크립트 이름을 제공합니다. 전체 명령 줄 인수가 뒤 따릅니다 .
  • @Rockallite 좋습니다. $@ 배열의 두 번째 및 세 번째 요소는 첫 번째 및 두 번째 인수입니다. "${@:1}"는 두 번째 요소 (첫 번째 인수)로 시작하는 전체 배열을 인쇄하고 ${@:0}는 첫 번째 요소에서 시작하는 전체 배열을 인쇄합니다. 스크립트의 이름. 무엇을 기대 했습니까?

답변

함수 매개 변수의 경우 는 전혀 작동하지 않았습니다. 또한 매개 변수가 다르기 때문에 첫 번째 요소를 잘라 내고 싶었습니다. 작동 한 것은 다음과 같습니다.

function foo(){ #takes single param + array of params local param1="$1". #first param local -a tmp=( "${@}" ) #copy all params local -a rem_params=( "${tmp[@]:1}") #slice off first:Works! # local -a rem_params=( "${@[@]:1}" ) #DID NOT WORK, ERROR # local -a rem_params=( "{@:1}" ) #DID NOT SLICE echo "${rem_params[@]}" } 

어쩌면 스크립트 수준에서 위치 인수로 이것이 어떻게 작동하는지 테스트하기 위해 작성할 것입니다.하지만 지금 당장은 시간이 없습니다.

답변

보통 이렇게합니다 :

somefunc() { local message="$1" shift echo "message = $message" echo "other = $@" } somefunc first second third goforth 

다음을 인쇄합니다.

message = first other = second third goforth 

두 번째, 세 번째 등의 인수 뒤에 shift 개념을 확장 할 수 있습니다.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다