我正在尝试使用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
答案 0 :(得分:2)
遇到这样的问题时,请使用调试工具,例如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
来将其视为语法,但通常这不是一个非常好的计划。)
有没有理由不写下你想要的实际命令,例如:
set -e
作为剧本的主体?
如果你想在失败的命令后自动退出,sh和bash都支持errexit
; bash为此提供了额外的名称-o
(作为set -e
选项)。因此,如果任何简单命令失败,set -e
cd $myGitRepo
git add --all
git commit -m "test commit msg"
git push
会告诉shell立即退出:
-e
(要结束set +e
行为,只需{{1}}。)