linux - упрощение семантического версионного скрипта - PullRequest
0 голосов
/ 15 мая 2018

У меня семантическое управление версиями для компонента приложения, и именно так я обновляю основной номер версии и затем сохраняю его в version.txt.Это кажется много строк для простой операции.Может ли кто-нибудь помочь мне урезать это?Я не использую bc в качестве образа Python для докера, который, кажется, не имеет этой команды.

Это извлечено из файла yml, а version.txt содержит только старший и младший номер.1,3 например.Приведенный ниже код обновляет только старшее число (1) и сбрасывает младшее число на 0. Так что, если бы я запустил код на 1.3, я бы получил 2.

- echo $(<version.txt) 1 | awk '{print $1 + $2}' > version.txt
  VERSION=$(<version.txt)
  VERSION=${VERSION%.*}
  echo $VERSION > version.txt
  echo "New version = $(<version.txt)"

1 Ответ

0 голосов
/ 15 мая 2018

О простоте

«Простой» и «короткий» - это не одно и то же.echo $foo короче echo "$foo", но на самом деле делает гораздо больше: разбивает значение foo на символы в IFS, оценивает каждый результат этого разделения как выражение glob и затем объединяет их.

Аналогично, упрощение вашего кода - например, ограничение количества шагов в процессе, через который он проходит - совсем не то же самое, что сделать его на короче.


Увеличение одного куска, оставление других без изменений

if IFS=. read -r major rest <version.txt || [ -n "$major" ]; then
  echo "$((major + 1)).$rest" >"version.txt.$$" && mv "version.txt.$$" version.txt
else
  echo "ERROR: Unable to read version number from version.txt" >&2
  exit 1
fi

Увеличение основного варианта, отбрасывание других

if IFS=. read -r major rest <version.txt || [ -n "$major" ]; then
  echo "$((major + 1))" >"version.txt.$$" && mv "version.txt.$$" "version.txt"
else
  echo "ERROR: Unable to read version number from version.txt" >&2
  exit 1
fi

Обоснование

Оба из перечисленных выше являются POSIX-совместимыми и избегают использования каких-либо возможностей, не встроенных в оболочку.

  • IFS=. read -r first second third <input читает первую строку ввода и разбивает еена . s в переменные оболочки first, second и third;в частности, столбец third в этом примере включает в себя все после первых двух, поэтому, если у вас есть a.b.c.d.e.f, вы получите first=a; second=b; third=d.e.f - отсюда и название rest, чтобы прояснить это.См. BashFAQ # 1 для подробного объяснения.
  • $(( ... )) создает арифметический контекст во всех POSIX-совместимых оболочках.Это полезно только для целочисленной математики, но, так как мы разбиваем части на read, нам нужна только целочисленная математика.См. http://wiki.bash -hackers.org / syntax / arith_expr
  • Запись в version.txt.$$ и переименование, если эта запись успешна, предотвращает оставление version.txt пустым или поврежденным, если произошел сбойместо между открытым и письмом.(Версия, которая беспокоилась о атаках по символическим ссылкам, использовала бы mktemp вместо того, чтобы полагаться на $$ для генерации уникального имени временного файла).
  • Переход к записи только в случае успеха read или [ -n "$major" ] имеет значение true, предотвращает сброс кода версией кода на 1 (путем добавления 1 к пустой строке, которая оценивается в арифметическом контексте как 0), если чтение не удалось.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...