"$@" 또는 배열을 문자열로 연결하는 방법

"$@" 또는 배열을 문자열로 연결하는 방법

이 도우미 bash 함수를 구현하려고 합니다.

ores_simple_push(){(

  set -eo pipefail
  git add .
  git add -A

  args=("$@")

  if [[ ${#args[@]} -lt 1 ]]; then
      args+=('squash-this-commit')
  fi

  git commit -am "'${args[@]}'" || { echo; }
  git push

)}

with: git commit -am 'some stuff here', 저는 따옴표를 입력하는 것을 정말 좋아하지 않으므로 다음을 원합니다.

ores_simple_push my git commit message here gets put into a single string

이는 다음과 같습니다:

git commit -am 'my git commit message here gets put into a single string'

이를 수행하는 합리적인 방법이 있습니까?

답변1

Korn/POSIX와 유사한 쉘에서 "$@"모든 위치 인수로 확장할 때 설정되지 않은 경우 분리(목록 컨텍스트에서)하거나 "$*"첫 번째 문자(일부 쉘의 바이트) 또는 SPC를 사용하여 위치 인수로 확장합니다. if 가 없는 $IFS연결 빈 문자열로 설정됩니다.$IFS$IFS

ksh/// zsh(배열을 지원하는 Bourne과 유사한 쉘 bash) 의 vs yash도 마찬가지입니다 ."${array[@]}""${array[*]}"

에서는 / 와 같고, zsh/ 에서는 와 같습니다 . 에서는 와 동일합니다 ."$array""${array[*]}"kshbash"${array[0]}"yash"${array[@]}"

에서는 매개변수 확장 플래그를 사용하여 zsh배열 요소를 임의의 구분 기호로 연결할 수 있습니다. 예를 들어 공간적으로 연결할 수 있습니다. 단일 문자/바이트 문자열로 제한되지 않고 매개변수 확장 플래그를 사용하여 구분 기호 사양에서 이스케이프 시퀀스나 변수를 사용할 수도 있습니다(예: TAB에서 연결 및 연결). 줄 바꿈(동일)과 연결된 바로가기 플래그도 참조하세요.j"${(j[ ])array}""${(j[ and ])array}"p"${(pj[\t])array}""${(pj[$var])array}"$varFpj[\n]

그래서 여기 있습니다:

ores_simple_push() (
  set -o errexit -o pipefail
  git add .
  git add -A

  args=("$@")

  if [[ ${#args[@]} -lt 1 ]]; then
      args+=('squash-this-commit')
  fi

  IFS=' '
  git commit -am "${args[*]}" || true
  git push
)

아니면 그냥 POSIXly:

ores_simple_push() (
  set -o errexit
  git add .
  git add -A

  [ "$#" -gt 0 ] || set square-this-commit

  IFS=' '
  git commit -am "$*" || true
  git push
)

일부 쉘(bash, ksh93, mksh 및 bosh는 포함하지만 dash, zsh 또는 yash는 포함되지 않음)에 대해 "${*-square-this-commit}"여기에서 이를 사용할 수도 있습니다.

완전성을 위해 bash배열을 임의의 문자열(zsh와 동일)과 연결하려면 joined=${(ps[$sep])array}다음을 수행할 수 있습니다.

IFS=
joined="${array[*]/#/$sep}"
joined=${joined#"$sep"}

(이것이 로케일의 유효한 텍스트라고 가정합니다. 그렇지 않은 경우 의 $sep내용이 나머지 내용과 연결되어 궁극적으로 유효한 텍스트를 형성할 때 두 번째 단계가 실패할 수 있습니다.)$sep


1 역사적으로 볼 때 Bourne 쉘에서는 SPC와 결합됩니다.$IFS

답변2

실제로 이것은 작동하는 것 같지만 이유는 모르겠습니다.

  git commit -am "${args}" || { echo; }

관련 정보