2012-05-14 1 views
2

Я наблюдал отличный курс сценариев оболочки через множество videos. Теперь, когда я думаю, что я хорошо знаком с оболочкой Bourne, я решил написать свой первый сценарий оболочки.неожиданный оператор [: git: in bourne shell script 'if' условное выражение

Цель скрипта: проверить, является ли рабочий каталог 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 ], что неожиданно?

В качестве бонуса, есть ли у вас какие-либо предложения или советы по повышению эффективности, логичности или удобочитаемости этого скрипта?

+0

С точки зрения логики, было бы легче понять, если вы сделали что-то вроде: die() {echo "ERROR: $ *"> & 2; выход 1; }; git diff-index --quiet HEAD || умирающий рабочий каталог не чист; git branch -f deployment || die не удалось создать или перезаписать ветвь развертывания ... –

+0

BTW - на какой платформе вы работаете? '/ bin/sh' - это POSIX sh, а не Bourne, практически для каждой операционной системы, построенной за последние два десятилетия, причем Sun является единственным отстающим. (Имя Баша подразумевает, что Борн является его ближайшим предшественником, но это был случай, когда точность была принесена в жертву за хороший каламбур). –

ответ

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.

+0

Не могу поверить, что я пропустил это. Видео очень хорошо объяснили, что '' 'на самом деле является тестовой программой. Большое спасибо. – Tom

Смежные вопросы