「$@」または配列を文字列に連結する方法

「$@」または配列を文字列に連結する方法

このヘルパーの 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)のvsyashも同様です。"${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関連付けられ、最終的に有効なテキストを形成すると2番目のステップが失敗する可能性があります。)$sep


1 歴史的に見ると、Bourne シェルは SPC と結合されます。$IFS

おすすめ記事