sh脚本:使用条件,git更新后脚本

时间:2012-08-20 12:19:53

标签: git sh conditional

我正在为git存储库编写更新后的脚本,并且遇到了一些麻烦。

无论出于何种原因,if语句都会抛出错误:

hooks/post-update: line 5: [master: command not found

我只是想查看推送的分支是否等于“master”。我猜我的语法有问题,这是我的第一个sh脚本,但是我尝试了几个没有运气的变种。

感谢您的帮助,

#!/bin/sh

BRANCH=$(git rev-parse --symbolic --abbrev-ref $1)

if ["$BRANCH" = "master"]
then
    cd $HOME/domain.com || exit
else
    cd $HOME/dev.domain.com || exit
fi

unset GIT_DIR
git pull hub $BRANCH
git checkout $BRANCH
exec git-update-server-info

1 个答案:

答案 0 :(得分:3)

方括号必须是单独的标记!你看,它试图看起来很好的语法,但事实是,有一个(内置在大多数shell中)命令[。所以语法应该是:

if [ "$BRANCH" = "master" ]
    ^                    ^
    +--------------------+-- There have to be spaces here!

如果没有第一个空格,命令将变为[master并且此命令不存在 - 命令为[。没有第二个空格,正确的参数将是master]并且不会匹配(并且[将失败并且#34;缺少]参数&#34;错误。< / p>


详细说明:

shell if语法尝试尽可能简单。它确实是

  

if 命令 than 命令 [else 命令] fi < / p>

其中每个命令必须以分号或行尾结束。所以你可以写像

这样的东西
if grep -q foo somewhere
then
    whatever
fi

现在在很多情况下你需要做比较字符串,比较数字,测试文件是否存在,测试一个文件是否比另一个文件更新等等。为此,有一个标准命令test(构建它) -in在大多数shell中,但外部版本始终存在)。它允许像

这样的东西
test "$foo" == "bar"
test -n "$this_variable_must_be_nonempty"
test -f "$this_file_should_exist"

这就是你在if中使用的。为了更好的语法,这个命令有别名[,它接受​​完全相同的参数,除了它需要]作为它的最后一个参数,所以条件看起来很漂亮。这也是内置于大多数shell中的,但通常也作为test的符号链接存在。所以不要被看起来像特殊语法的东西所迷惑;它是简单的程序调用。