Сценарий Bash Для Нахождения Номера выпуска Debian от/etc/debian_version

Я зафиксировал его путем установки шрифта с:

SYSFONT=latarcyrheb-sun16
3
19.01.2014, 10:40
3 ответа

Существует много способов сделать то, что Вы хотите. Этот просто удаляет десятичную точку и все после от номера версии:

VERSION=$(sed 's/\..*//' /etc/debian_version)

\..* означает период (\.) сопровождаемый нулем или большим количеством любого символа (.*). Таким образом, для sed, выражение s/\..*// средства заменяют период и все, что не следует ни с чем. Результат sed команда сохраняется в переменной среды VERSION.

Вышеупомянутое избавляет от необходимости if/then/elif/.../fi операторы. Это будет работать и с ударом и с обычным/bin/sh.

Еще: sed потоковый редактор: это означает, что читает строки из stdin, редактирует их согласно инструкциям и (обычно) отправляет их в stdout. В этом случае мы даем ему инструкцию "по замене". Например, s/foo/bar/ средства находят первое вхождение нечто и заменяют его панелью. Как особый случай, s/foo// замена средств foo ни с чем. В нашем случае мы хотим заменить период, сопровождаемый любым символом ни с чем. Теперь, период то, за исключением того, что sed обычно рассматривает период для значения "любого символа". Так, мы должны "выйти" из него путем помещения обратной косой черты перед ним. Когда sed видит \., это знает, что мы имеем в виду литеральный период. Мы также хотим стереть любые символы после периода. Для представления "любого символа" мы используем период . (никакой Escape). Для генерала, тем не менее, мы хотим удалить все символы после периода, независимо от того, сколько существует. Так, в то время как в sedязык, период означает любой символ, звезда означает "любое количество предшествующего символа" (который мог быть нулем). Таким образом звезда периода .* нуль средств или больше любого символа. Так, соединение всего этого, s/\..*// говорит sed это, если это находит период, возможно сопровождаемый чем-нибудь, затем ничем заменяет его.

6
27.01.2020, 21:08
  • 1
    Может этот ответ быть разработанным для меня. Я понимаю что s/ средняя часть, но что относительно \..* ? –  Danijel-James W 21.01.2014, 04:20
  • 2
    @DanijelJ я добавил некоторое объяснение. Это может наложиться с тем, что Вы уже знаете, но я полагал, что это было лучше, чем игнорирование чего-то, что Вы не сделали. Сообщите мне, помогает ли это. –  John1024 21.01.2014, 08:14
  • 3
    Да, это объясняет много мне. Я понял \. Я просто не мог понять второе .. Спасибо за разъяснение этого для меня. –  Danijel-James W 22.01.2014, 04:27

Вот решение, которое использует удар, никакие внешние утилиты, и является единственным вызовом

read -d . VERSION < /etc/debian_version

Это читает /etc/debian_version, разделяет вход на периоде (.), присваивает все перед периодом к VERSION и отбрасывания все после.


IFS='.' read VERSION VERSION_MINOR < /etc/debian_version

Это немного отличается в этом, это сохраняет все после периода в VERSION_MINOR


IFS='.' read -a VERSION < /etc/debian_version

Этот является самым мощным в этом, это разделяет на периоде и присваивает массиву $VERSION. Если версия 1.2.3 затем ${VERSION[0]} == 1 ${VERSION[1]} == 2 и ${VERSION[2]} == 3.

7
27.01.2020, 21:08
  • 1
    Это превосходно! Я никогда не видел, что чтение используется как это! –  Danijel-James W 21.01.2014, 04:21
case `cat /etc/debian_version` in
7*) VERSION=7;;
*) VERSION=NONE;;
esac

Конечно, это может быть расширено для распознавания большего количества версий.

2
27.01.2020, 21:08

Теги

Похожие вопросы