Bash:传递脚本参数

7

我有一系列的命令在提交git项目之前需要运行,因此我将它们放在了一个bash脚本中。最后,我有一个模块用于提交:

if [ -z $1 ]; then git commit -a -m "no message"; else; git commit -a -m $1; fi

带有期望的信息传递给脚本。
$ ./dostuff_then_commit "my message"

当我这样做时,我得到了那个结果。
fatal: Paths with -a does not make sense.

因为$1已经被定义,但是消息没有正确传递?有人能看到问题或建议一个解决方案吗?谢谢SO。

4个回答

7
如果消息包含空格,则会扩展为多个参数传递给git commit。(注意在其他情况下的引号。)请加引号:
if [ -z "$1" ]; then
    git commit -a -m "no message"
else
    git commit -a -m "$1"
fi

还有几点需要补充:

  • 我也引用了[]中的内容,原因略有不同:如果提交信息为空,你将会从[得到一个缺少参数的诊断信息。再次引用它可以避免这种情况。(你可能想要捕获这个错误并让用户输入一个真正的提交信息,但如果必要的话,你可能会得到一堆asdfzxcv的提交信息....)

  • 你得到的错误信息是因为提交信息的第一个单词被视为提交信息,其余部分被传递为特定的文件名进行提交;而在提交所有内容(-a)时,这样做是没有意义的,就像错误信息所述。


谢谢你额外添加的部分。 - hatmatrix

2

尝试使用引号将$1括起来 - 否则git会认为my是信息,而message是其他内容。

if [ -z $1 ]; then git commit -a -m "no message"; else; git commit -a -m "$1"; fi

2
我想补充一下,您可以这样组合选项:
git commit -am "some message"

1

你应该使用"$1"而不是$1 as,因为$1可能包含空格。

$1替换为my message

git commit -a -m $1

给出:

git commit -a -m my message

当:

git commit -a -m "$1"

给出:

git commit -a -m "my message"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接