Цикл While с оператором if плюс результат переменной

#bash

Вопрос:

Я писал сценарий для себя, чтобы суммировать команды, которые я использую ежедневно, в одном удобном сценарии. Поэтому в основном я закончил это с условной проверкой, существует ли папка .git в первую очередь, но я хотел бы сделать ее более интересной и лучше понять цикл. Мое желание состоит в том, чтобы иметь такую переменную, как:

«вывод=$(статус git)», и если результат равен 0, продолжайте в зависимости от инструкции. Если результат отличается от 0, разорвите цикл и завершите сценарий сообщением типа «в фактическом каталоге нет репозитория .git».

Я даю вам свое первое представление об этом, но без статуса git, так как я не знаю, как его добавить и куда. Спасибо вам, ребята!

 set -e 

gitrepo=true

while [ $gitrepo == true ]; do
  if [[ $? -ne 0 ]]; then
     echo "not a git directory"
     $gitrepo=false
  else

  read -p "Commit message: " commit

  git commit -am "$commit"
  fi  
done

 

Комментарии:

1. Пожалуйста, добавьте подходящий shebang ( #!/bin/bash ), а затем вставьте свой скрипт в shellcheck.net и постарайтесь выполнить содержащиеся там рекомендации.

2. @DavidC.Rankin : Разве $? в этот момент не гарантируется, что это правда? В конце концов, последний выполненный оператор был [ $gitrepo == true ] , и это должно было установить код выхода равным 0 (иначе цикл не был бы введен). ИМО, у нас просто нескончаемый цикл.

3. @user1934428 — да, мой плохой, у вас будет $? , так как 0 из [ $gitrepo = true ] вашего цикла не заканчивается, потому $gitrepo=false что попадание в if [[ $? -ne 0 ]] который никогда не будет проверять ложь, если gitrepo не изменится (случай с курицей и яйцом :)

4. Но, ребята, я хотел бы реализовать «статус git» также внутри цикла, и поэтому, если статус git вернет общий ответ «Фатально: не репозиторий git», выйдите с «Не каталог git, проверьте путь». Таким образом, в случае, если git status возвращает ненулевой код состояния, он завершается с каталогом не git. Но это обязывает меня сначала запустить статус git, а затем скрипт, в котором нет смысла, так как скрипт должен все делать сам (если это возможно).

Ответ №1:

Попробуйте вот что: я сделал так, как предложил Сайрус:

 #!/usr/bin/env bash

set -e 

gitrepo=True

while [[ $gitrepo ]]; do

  if [[ ! $? ]]; then
      echo "not a git directory"
      gitrepo=False
  else
      read -p "Commit message: " -r commit
      git commit -am "$commit"
      exit 0
  fi  

done