
このヘルパーの 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[*]}"
ksh
bash
"${array[0]}"
yash
"${array[@]}"
では、パラメータ拡張フラグを使用して、zsh
配列要素を任意の区切り文字に連結できます。たとえば、空間的に接続できます。単一文字/バイト文字列に限定されず、パラメータ拡張フラグを使用して、区切り文字仕様でエスケープシーケンスまたは変数を使用することもできます(たとえば、TABでの接続と接続)。改行(同じ)に関連付けられているショートカットフラグも参照してください。j
"${(j[ ])array}"
"${(j[ and ])array}"
p
"${(pj[\t])array}"
"${(pj[$var])array}"
$var
F
pj[\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
答え2
実際、これはうまくいくようですが、理由はわかりません。
git commit -am "${args}" || { echo; }