我想编写一个updategit.sh
带有默认参数的 unix/linux 脚本来提交到 git。updategit.sh
应该与 POSIX 兼容。我希望 POSIX 能够解决 unix/linux shell 的一些最严重的不兼容性。
句法:updategit.sh {$1}
{$1}
表示该参数$1
是可选的。
1)如果没有传递参数,则updategit.sh
脚本中的最后一个动作应该是:
git commit -m 'Patches #1023, #1016.4 .. .17 reapplied. See e-mail from Paul ([email protected]) send at 2016-01-26 08:56'
当文本不包含单引号时,用单引号传递就足够了?
2) 应该可以将可选参数传递$1
给updategit.sh
。自然的语法是将参数括在双引号中。我认为这是不可能的。我希望能够尽可能多地获取 ,而不会updategit.sh
因为 shell 破坏输入参数和命令而失败,因为 shell 会弄乱输入。
自然的语法应该是这样的:
$ ./updategit.sh "New template GetShape()"
$ ./updategit.sh "Patch #312.5 applied. See Eve's email ([email protected]) from 2016-02.29 09:43"
$ ./updategit.sh "Round to .5 fixed"
$ ./updategit.sh
很明显,shell 会干扰输入。我怎样才能接近“自然”语法而不会git commit -m $1
失败?据我所知,该命令git commit -m $1
必须重写为更强大的内容。
答案1
从技术上讲,所有 shell 脚本的参数都是可选的。脚本将自行决定是否缺少参数以及如何处理。这可以根据您的需要以多种方式完成。对于只有一个可选参数的脚本,可以使用以下方法:
#!/usr/bin/env sh
if [ ${#1} -eq 0 ]
then
git commit -m "default message"
else
git commit -m "$1"
fi
这将检查第一个参数的长度是否为零并采取相应措施。如果缺少第一个参数,则将其视为长度为零。您还可以通过与 进行比较来检查参数数量$#
。
上述脚本的较短版本利用了空参数替换,如下所示:
#!/usr/bin/env sh
git commit -m "${1:-default message}"
这种事情被描述这里“2.6.2 参数扩展”下。