- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在为 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
最佳答案
方括号必须是单独的标记!你看,它试图看起来像漂亮的语法,但事实是,有一个(内置在大多数 shell 中)命令 [
。所以语法应该是:
if [ "$BRANCH" = "master" ]
^ ^
+--------------------+-- There have to be spaces here!
如果没有第一个空格,命令将变为 [master
,这样的命令不存在——命令是 [
。如果没有第二个空格,正确的参数将是 master]
并且不会匹配(而且 [
将因“缺少 ]
参数”而失败错误。
详细说明:
shell if
语法尽量简单。真的是
if
commandthan
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
的符号链接(symbolic link)存在。所以不要被看起来像特殊语法的东西所迷惑;这是简单的程序调用。
关于git - sh 脚本 : using conditionals, git 更新后脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12037513/
我是一名优秀的程序员,十分优秀!