git - Bash:如何使用变量运行需要引号的命令?

标签 git bash

我有一个 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中的任何特殊字符都会按原样传递给 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"

关于git - Bash:如何使用变量运行需要引号的命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40090699/

相关文章:

git - 从服务器 pull Git

git - 分支一个非 merge 的功能分支?

bash - 如何在 bash 中快速杀死 java 进程?

bash - 如何将一个文件中的行 append 到另一个文件的每一行的末尾?

python - Linux/庆典 : Sourcing a script and then assigning it to a variable

bash:/usr/local/sphinx/bin/search:没有这样的文件或目录

eclipse - 在 Eclipse 中将项目更新为 Git

java - 通过 Eclipse 插件控制将哪个 GIT 分支部署到 AWS ElasticBeanstalk

python - 重命名组名标题 pandas

git - 将 Git 存储库克隆到新的存储库中 - 没有提交历史记录