用于执行 git 更新的 Bash 脚本



我正在尝试使用 bash 脚本按顺序运行多个 git 命令来更新存储库。如果我手动将其输入终端,我在最后连接的命令会起作用,但在 bash 脚本中它不执行任何操作。我犯的 bash 语法错误是什么?

cmd1="cd $myGitRepo"
cmd2="git add --all"
cmd3="git commit -m "test commit msg""
cmd4="git push"
cmd="$cmd1 && $cmd2 && $cmd3 && $cmd4"
echo "$cmd"
$cmd

遇到此类问题时,请使用调试工具,例如 echo 调试器或 -x 标志:

bash-3.2$ cmd="echo foo && echo bar"
bash-3.2$ $cmd
foo && echo bar
bash-3.2$ 

这表明当&&是 shell 变量的结果时,它不被视为语法。 等效地:

bash-3.2$ set -x
bash-3.2$ $cmd
+ echo foo '&&' echo bar
foo && echo bar
bash-3.2$ 

-x 标志告诉 shell 在运行之前打印出每个命令,前面是+标记。

(您可以通过在前面添加eval来将其视为语法,但总的来说,这不是一个非常好的计划。

是否有理由不只编写您想要完成的实际命令,例如:

cd $myGitRepo && git add --all && git commit -m "test commit msg" && git push

作为脚本的正文?

如果你想在命令失败后自动退出,sh 和 bash 都支持 set -e ;bash 给它额外的名称errexit(作为一个-o选项)。 因此,set -e告诉 shell 如果任何简单命令失败,立即退出:

set -e
cd $myGitRepo
git add --all
git commit -m "test commit msg"
git push

(要结束-e行为,只需set +e

最新更新