#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