2

私は多数のビデオを通して優れたシェルスクリプトコースを見てきました。Bourneシェルにかなり精通していると思うので、最初のシェルスクリプトを作成することにしました。

スクリプトの目標: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ステートメントの条件付き引数はコマンドです。通常、このtestコマンドは他の言語のように見せるために使用されますが、任意のコマンドをそこに置くことができます。戻りコード0で終了するものはtrueと評価され、それ以外のものはfalseと評価されます。

于 2012-05-14T18:28:28.023 に答える