簡體   English   中英

Bash:如何使用變量運行命令期望引號?

[英]Bash: How to run command expecting quotes using a variable?

我有一個要在腳本中運行的git命令:

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語句。 我在執行實際命令的最后一步遇到了麻煩。 我不知道如何使用期望的報價+插值來運行它。

===更新===

在查看@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 filter-branch -f --env-filter "$ENVFILTER"

只要引用了擴展名, 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"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM