2

我通过大量视频观看了出色的 shell 脚本课程。既然我认为我对 Bourne shell 相当熟悉,我决定编写我的第一个 shell 脚本。

脚本目标:检查 git 工作目录是否干净。如果是这样,请将工作目录覆盖到名为deployment. 最后,将部署分支推送到源站。

我最终得到了这段代码:

#!/bin/sh

######################################################
# Deploys working directory to git deployment branch.
# Requires that the working directory is clean.
######################################################

#check if the working directory is clean
if [ git diff-index --quiet HEAD ]
then
    if [ git branch -f deployment ]
    then
        if [ git push origin deployment ]
        then
            echo
            echo "OK. Successfully deployed to git deployment branch."
            echo
            exit 0 #success
        else
            echo
            echo "Error: failed to push deployment branch to origin."
            echo
            exit 1 #failure
        fi
    else
        echo
        echo "Error: failed to create or overwrite deployment branch."
        echo
        exit 1 #failure
    fi
else
    echo
    git status #show the status of the working directory
    echo
    echo "Error: working directory is not clean. Commit your changes first..."
    echo
    exit 1 #failure
fi

不幸的是,这似乎给了我一个错误:./tools/deploygit: 9: [: git: unexpected operator

为什么会这样?我在使用什么运算符if [ git diff-index --quiet HEAD ]是出乎意料的?

作为奖励,您对如何提高此脚本的效率、逻辑或可读性有任何建议或提示吗?

4

1 回答 1

8

在本声明中:

if [ git diff-index --quiet HEAD ]

[test命令的别名,所以你实际运行的是......

if test git diff-index --quiet HEAD ]

...这不是你的意思。您不需要使用test命令来评估命令的结果;你应该这样做:

if git diff-index --quiet HEAD

查看该if命令的文档:

$ help if
if: if COMMANDS; then COMMANDS; [ elif COMMANDS; then COMMANDS; ]... [ else COMMANDS; ] fi

if语句的条件参数是command。通常,该test命令用于使其看起来像其他语言,但您可以将任何命令放在那里。以返回码 0 退出的事物评估为 true,其他任何事物评估为 false。

于 2012-05-14T18:28:28.023 回答