用shell脚本自动发送git commit -m “xxx“命令时,注释中有空格会报错的解决方法

问题现象

我们希望用shell脚本实现自动发送
git commit -m “line1
line2
line3
new line4”
命令的功能,shell脚本的代码如下:

#!/bin/bash
LINE1="line1"
LINE2="line2"
LINE3="line3"
LINE4="new line4"

git add .
git commit -m ${LINE1}$'\n'${LINE2}$'\n'${LINE3}$'\n'${LINE4}

但是实际运行中发现,commit信息中如果有空格存在(如上面的"new line4"),脚本运行会报错。下面是脚本运行的预期结果和实际出错的结果:

预期结果如下:
在这里插入图片描述

实际运行代码时,会报错如下:
error: pathspec ‘line4’ did not match any file(s) known to git.
在这里插入图片描述

问题分析

出现这个问题,可能是因为在shell脚本看来,此时要发送的命令是:

git commit -m …line3\nnew line4

此时,字符串"line4"被识别成了一个新的选项,并且是无法识别的选项,所以会报如上的错误。并且,我尝试在${LINE1}前面和${LINE4}后面加了双引号" \" ",也没有解决这个问题。

注:\n是因为使用了多行,用它来换行的。

解决方法

可以使用字符串拼接和转义字符,将LINE4改写成如下格式规避:

git commit -m ${LINE1}$'\n'${LINE2}$'\n'${LINE3}$'\n'"new"\ "line4"

上面的代码使用"\ "对空格进行了转义处理,让git commit认为空格也是字符串的一部分,从而避免把"line4"识别成一个选项,也就不会报刚才的错误了。

该方法的不足

  1. 这个方法虽然能暂时规避这个问题,但是只适用于空格较少的情况。如果要提交的commit信息中空格较多,用这种方法肯定比较繁琐。
  2. 用这种方法写出来的shell代码,可读性和美观性都较差。

后续如果我发现了更好的解决方法,会再回来更新在这里;也希望大家如果有更好的解决办法,可以不吝赐教呀~


版权声明:本文为weixin_42328158原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。