传递 unix shell(可选)文本参数而不进行扩展

传递 unix shell(可选)文本参数而不进行扩展

我想编写一个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) 应该可以将可选参数传递$1updategit.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 参数扩展”下。

相关内容