问题现象
我们希望用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"识别成一个选项,也就不会报刚才的错误了。
该方法的不足
- 这个方法虽然能暂时规避这个问题,但是只适用于空格较少的情况。如果要提交的commit信息中空格较多,用这种方法肯定比较繁琐。
- 用这种方法写出来的shell代码,可读性和美观性都较差。
后续如果我发现了更好的解决方法,会再回来更新在这里;也希望大家如果有更好的解决办法,可以不吝赐教呀~