2

gitリポジトリの更新後のスクリプトを書いていますが、少し問題があります。

何らかの理由で、ifステートメントがエラーをスローしています。

hooks/post-update: line 5: [master: command not found

プッシュされたブランチが「マスター」に等しいかどうかを確認したいだけです。構文に何か問題があると思います。これが私の最初の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
4

1 に答える 1

3

角かっこは個別のトークンである必要があります。ご覧のとおり、これは素晴らしい構文のように見えますが、実際には(ほとんどのシェルに組み込まれている)コマンドがあり[ます。したがって、構文は次のようになります。

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

最初のスペースがないと、コマンドはになり[master、そのようなコマンドは存在しません-コマンドは[です。2番目のスペースがないと、正しい引数はmaster]一致し、一致しません(そして、 「引数がありません」というエラー[で失敗し]ます。


詳細な説明:

シェルif構文は、可能な限り単純にしようとします。本当に

if コマンド than コマンド [else コマンド]fi

ここで、各コマンドはセミコロンまたは行末で終了する必要があります。だからあなたは次のようなものを書くことができます

if grep -q foo somewhere
then
    whatever
fi

多くの場合、文字列の比較、数値の比較、ファイルの存在のテスト、あるファイルが別のファイルよりも新しいかどうかのテストなどを行う必要があります。これには、標準コマンドがありますtest(ほとんどのシェルに組み込まれていますが、外部バージョンは常に存在します)。それは次のようなことを可能にします

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

これは、ifで使用するものです。構文をわかりやすくするために、このコマンドには、条件がきれいに見えるように最後の引数として[必要なことを除いて、まったく同じ引数を受け入れるエイリアスがあります。]これもほとんどのシェルに組み込まれていますが、通常はへのシンボリックリンクとしても存在しtestます。したがって、特別な構文のように見えるものにだまされないでください。単純なプログラム呼び出しです。

于 2012-08-20T12:51:16.640 に答える