【问题标题】:sh scripting: using conditionals, git post-update scriptsh 脚本:使用条件,git post-update 脚本
【发布时间】:2012-08-15 18:35:24
【问题描述】:

我正在为 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

【问题讨论】:

    标签: git sh conditional


    【解决方案1】:

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

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

    没有第一个空格,命令变成[master,这样的命令不存在——命令是[。如果没有第二个空格,正确的参数将是 master] 并且不会匹配(并且 [ 将失败并出现“缺少 ] 参数”错误。


    详细说明:

    shell if 语法尽量简单。真的是

    if command than command [else command] fi

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

    if grep -q foo somewhere
    then
        whatever
    fi
    

    现在在许多情况下,您需要执行比较字符串、比较数字、测试文件是否存在、测试一个文件是否比另一个文件更新等操作。为此,有一个标准命令 test(内置在大多数 shell 中,但外部版本始终存在)。它允许像

    test "$foo" == "bar"
    test -n "$this_variable_must_be_nonempty"
    test -f "$this_file_should_exist"
    

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

    【讨论】:

      猜你喜欢
      • 2012-03-02
      • 1970-01-01
      • 2022-08-23
      • 1970-01-01
      • 2016-07-23
      • 2014-07-04
      • 1970-01-01
      • 1970-01-01
      • 2013-11-01
      相关资源
      最近更新 更多