我正在为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
答案 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
的符号链接存在。所以不要被看起来像特殊语法的东西所迷惑;它是简单的程序调用。