私は私のスクリプトで実行したいのgitコマンドがあります。Bash:変数を使って引用符を期待するコマンドを実行するには?
git filter-branch -f --env-filter "STUFF HERE IN QUOTES"
事は私のスクリプトに私は動的にSTUFF HERE IN QUOTES
によって表される文字列を作成しています、次のとおりです。
ENVFILTER=""
while read commit; do
IFS="|" read date hash message <<< "$commit"
DATE_NO_SPACE="$(echo "${date}" | tr -d '[[:space:]]')"
COMMIT_ENV=$(cat <<-END
if [ \$GIT_COMMIT = $hash ]
then
export GIT_AUTHOR_DATE="$DATE_NO_SPACE"
export GIT_COMMITTER_DATE="$DATE_NO_SPACE"
fi
END
)
ENVFILTER="$ENVFILTER$COMMIT_ENV"
done < $tmpfile
git filter-branch -f --env-filter \'"$ENVFILTER"\' // <---------- does not work
基本的には空の文字列ENVFILTER
で始まり、それを他の文字列と連結してif文の束を形成します。私は実際のコマンドを実行している最後のステップに問題があります。私は予想される引用符+補間値でそれを実行する方法を知らない。
=== === UPDATE
@のchepnerの答えを見て、"$ENVFILTER"
を使用した後、私は今、コマンドを正常に実行することができます。答えは正しいです。
はしかし、私のif
文(引用符に関連しない)程度の誤差があります:
Rewrite eeb8860c13179c931a513a9ada76dc109324d790 (1/17)/opt/boxen/homebrew/Cellar/git/2.6.2/libexec/git-core/git-filter-branch: eval: line 313: syntax error near unexpected token `if'
/opt/boxen/homebrew/Cellar/git/2.6.2/libexec/git-core/git-filter-branch: eval: line 313: ` fi if [ $GIT_COMMIT = 08a2d85f9412c67435929d80ccc5b914f3ad8547 ]'
env filter failed: if [ $GIT_COMMIT = 59d13c174c34b6540f61585ef507abcef29ab22e ]
then
export GIT_AUTHOR_DATE="2016-10-02T21:16:37-04:00"
export GIT_COMMITTER_DATE="2016-10-02T21:16:37-04:00"
fi if [ $GIT_COMMIT = 08a2d85f9412c67435929d80ccc5b914f3ad8547 ]
then
export GIT_AUTHOR_DATE="2016-08-31T17:54:28-04:00"
export GIT_COMMITTER_DATE="2016-08-31T17:54:28-04:00"
fi if [ $GIT_COMMIT = d7801396f5fb1092beec3aa484361cd50ab35e9e ]
then
export GIT_AUTHOR_DATE="2016-08-31T17:53:07-04:00"
export GIT_COMMITTER_DATE="2016-08-31T17:53:07-04:00"
fi if [ $GIT_COMMIT = 7930e9be149a57229c9fc26ccffe1c6453317d70 ]
then
export GIT_AUTHOR_DATE="2016-08-31T17:48:03-04:00"
export GIT_COMMITTER_DATE="2016-08-31T17:48:03-04:00"
fi if [ $GIT_COMMIT = f0849b2de99ac37790eaf6e40c8980988e865c7c ]
then
export GIT_AUTHOR_DATE="2016-08-31T17:46:33-04:00"
export GIT_COMMITTER_DATE="2016-08-31T17:46:33-04:00"
fi
[
はそれで何か問題はありますか?私はENVFILTER
が正しいコードが含まれていると仮定すると、それを
コマンド*が*実際にリテラル引用符を期待していません:、私は少し発電をクリーンアップするだろうと述べ
。ドキュメンテーションが引用符を表示するとき、それらは*構文的な引用符であり、 'git'ではなく*シェルに*を示す*、その内容は単一の引数として渡されるべきです。 'argv'配列のシェルが渡す引数には、リテラル内容のみが含まれます。シェルの処理中に構文が削除されます。 –
答えにchepnerがしたように引用符の中に '; 'を入れなかったようですね。 –
が必要ですか?このように、もしあれば...。それから...; fi; ' – Edmund