2016-10-17 4 views
2

私は私のスクリプトで実行したいの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が正しいコードが含まれていると仮定すると、それを

+0

コマンド*が*実際にリテラル引用符を期待していません:、私は少し発電をクリーンアップするだろうと述べ


。ドキュメンテーションが引用符を表示するとき、それらは*構文的な引用符であり、 'git'ではなく*シェルに*を示す*、その内容は単一の引数として渡されるべきです。 'argv'配列のシェルが渡す引数には、リテラル内容のみが含まれます。シェルの処理中に構文が削除されます。 –

+0

答えにchepnerがしたように引用符の中に '; 'を入れなかったようですね。 –

+0

が必要ですか?このように、もしあれば...。それから...; fi; ' – Edmund

答えて

3

を得ることはありません、これはあなたが必要とするすべてである:

git filter-branch -f --env-filter "$ENVFILTER" 

ENVFILTER内の任意の特殊文字はgitにそのまま渡される限り展開が引用されるときに。

envfilter= 
while IFS="|" read -r date hash message; do 
    envfilter+="if [ \$GIT_COMMIT = \"$hash\" ]; then echo \"here\"; fi;" 
done < "$tmpfile" 
git filter-branch -f --env-filter "$envfilter" 
+0

私は、それよりもはるかにクリーンアップするだろう - ここでコード生成を行う必要はない。我々は一致するコンテンツの環境変数を参照することができます。 –

+0

oooo cool!私はスクリプト内の実際のコードを表示するために私の答えを更新するつもりです。私のif文について不平を言っています。一秒 – Edmund

+0

ところで、私は '' | ''が間違っている前の空間を想定していますか? –

関連する問題