분할 매개변수 목록

분할 매개변수 목록

가변 개수의 인수를 허용하는 bash 함수를 만들고 싶습니다. 매개변수가 하나 이상 있어야 합니다. 그런 다음 받아들이는 첫 번째 매개변수와 나머지 매개변수 사이에 고정 값을 삽입해야 하는 다른 프로그램을 호출합니다.

나는 이것을 기반으로이 답변

tt() {
  name="$1"
  params="${@:2}"
  someapp ${name} 1234 /some/path "${params}"
}

그런데 생각보다 안 되더라구요

tt John has fun

결과 호출은 다음과 같습니다.

someapp John 1234 /some/path 'has fun' 

따옴표를 참고하십시오. 반면 결과는 다음과 같습니다.

someapp John 1234 /some/path has fun 

마지막 두 매개변수는 공개 따옴표로 묶이지 않습니다.

답변1

첫 번째 인수를 선택 shift하고 저장된 첫 번째 인수와 나머지 인수를 사용하여 다른 명령을 호출합니다.

tt () {
   name=$1
   shift

   someapp "$name" 1234 /some/path "$@"
}

또는 시도하는 것과 같은 명명된 배열을 사용하십시오.

tt () {
    name=$1
    params=( "${@:2}" )

    someapp "$name" 1234 /some/path "${params[@]}"
}

자신의 코드에서 가장 큰 문제점은 변수를 params배열로 생성하거나 사용하지 않는다는 것입니다. 이를 올바르게 수행하는 것은 큰따옴표와 비트를 포함하여 params=( "${@:2}" )at as 를 사용하는 것과 같습니다 ."${params[@]}"[@]

배열 할당은 항상 다음과 같으 name=( ... )므로 params="${@:2}"배열이 아니라 처음부터 두 번째 요소로 구성된 단일 문자열이 "$@"구분 기호로 공백으로 연결됩니다.

에 큰따옴표가 없으면 "${params[@]}"쉘은 배열의 각 요소를 공백, 탭 및 줄 바꿈( $IFS기본값은 의 문자)으로 분할한 다음 각 결과 단어에 파일 이름 글로빙을 적용합니다. 그렇지 않은 경우 [@]배열의 첫 번째 요소만 가져옵니다.


간단한 재작성:

tt () { someapp "$1" 1234 /some/path "${@:2}"; }

관련 정보