매개변수 배열을 매핑한 후 문자열로 변환

매개변수 배열을 매핑한 후 문자열로 변환

나한테 이것들이 있다고 해봐세게 때리다스크립트의 기능:

foo(){
  my_args_array=("$@")
  export my_args="${my_args_array[@]}"
  bar $my_args
}

bar(){
  echo "number of args: $#";
}


foo a b 'c d e'

위 스크립트를 실행하면 다음과 같은 결과를 얻습니다.

매개변수 수: 5

하지만 내가 찾고 있는 것은 다음과 같습니다.

매개변수 수: 3

my_args_array[@]그래서 내 질문은 - 각 요소를 작은따옴표로 묶을 수 있도록 반환된 값을 매핑하는 방법이 있습니까 ? 또는 환경 변수 문자열을 원래 명령줄 인수처럼 보이게 만들기 위해 필요한 모든 작업을 수행합니다.

답변1

문자열이 아닌 배열을 사용하십시오.

#!/bin/bash
foo(){
  my_args=("$@")
  bar "${my_args[@]}"
}

bar(){
  echo "number of args: $#";
}


foo a b 'c d e'

답변2

Bash에서 "${array[@]}"할당 오른쪽에 (or )를 사용하는 것은 (or )와 약간 비슷합니다. 공백을 구분 기호로 사용하여 배열 요소를 단일 문자열로 연결합니다. (( )는 사용된 첫 번째 문자(바이트?)입니다.) 이는 의 인수에도 적용됩니다."$@"${array[*]}"$*"${array[*]}"$*"IFSexportdeclarelocal

a b c d e그런 다음 에 들어가면 인용 my_args되지 않은 확장이 분할됩니다.

배열을 원하면 배열을 사용하십시오.

foo() {
    bar "$@"
}
bar() {
    echo "number of args: $#";
}
foo a b 'c d e'

또는 문자열을 원하는 경우 명확성을 위해 명시적으로 사용하는 것이 좋습니다 "${array[*]}".

(FWIW, Bash는 환경을 통한 배열 내보내기를 지원하지 않습니다.[1] [2])

관련 정보