#! называется shebang, когда он встречается как начальные два символа в начальной строке скрипта. Он используется в сценариях для указания интерпретатора для выполнения. [F3] для операционной системы (ядра), а не для оболочки; поэтому он не будет интерпретироваться как комментарий.
Предоставлено: http://en.wikipedia.org/wiki/Shebang_%28Unix%29
В общем случае, если файл является исполняемым, но фактически не исполняемой (двоичной) программой, и такая строка присутствует, программа, указанная после #! запускается с именем сценария и всеми его аргументами. Эти два символа # и! должны быть первые два байта в файле!Предоставлено: http://en.wikipedia.org/wiki/Shebang_%28Unix%29
Мой вариант на том, что уже было предложено:
. /etc/os-release; echo ${VERSION/*, /}
Самый короткий, самый быстрый ответ на сегодняшний день.
Если вы не хотите загружать содержимое /etc/os-release в ваша текущая среда, вы можете подделать bash, думая, что загружает сценарий довольно легко:
bash <(cat /etc/os-release; echo 'echo ${VERSION/*, /}')
$ grep $(lsb_release -rs) /usr/share/python-apt/templates/Ubuntu.info | grep -m 1 "Description: Ubuntu " | cut -d "'" -f2
Trusty Tahr
$ awk -v var=$(lsb_release -rs) '$3~var {print $4" "$5;exit;}' /usr/share/python-apt/templates/Ubuntu.info | cut -d"'" -f2
Trusty Tahr
Объявление и назначение Переменная в awk выполняется с помощью параметра -v. Значению команды lsb_release -rs присваивается переменная var, которая inturn помогает распечатать поле 4, поле 5 из строк содержит строку 14.04 и существует, если ее нашел один. Наконец, команда cut помогает удалить одинарные кавычки.
Команда, которую вы ищете, это:
grep -oP '(?<=VERSION\=\"(\d\d)\.(\d\d)\,\ )(.*?)(?="$)' /etc/os-release
Это очень уродливо и не оптимизировано. Я уверен, что должен быть более простой метод, и у него есть некоторые проблемы.
Вот еще несколько вариантов. Все они анализируют файл /etc/os-release, который в моем 13.10 выглядит так:
NAME="Ubuntu"
VERSION="13.10, Saucy Salamander"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 13.10"
VERSION_ID="13.10"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
Все приведенные ниже решения будут анализировать вторую строку для создания Saucy Salamander.
] grepgrep -oP 'VERSION=.* \K\w* \w*' /etc/os-release
-o означает «распечатать только соответствующую часть строки», а функция -P позволяет использовать регулярные выражения, совместимые с Perl. Это позволяет нам использовать \K, который отбрасывает все, что было сопоставлено с этой точкой, что в сочетании с -o означает «печатать только то, что соответствует после \K. Таким образом, фактическое регулярное выражение будет соответствовать последним двум словам строка, содержащая VERSION=. awk awk -F'[" ]' '/VERSION=/{print $3,$4}' /etc/os-release
Установка разделителя полей в " и space означает, что 3-го и 4-го полей строки, содержащей VERSION=, являются следующей строкой. sed sed -nr '/VERSION=/{s/.* (\w* \w*)"/\1/;p}' /etc/os-release
Переключатель -n подавляет нормальный выход, строки не будут напечатаны. -r позволяет использовать расширенные регулярные выражения. Затем в строках, соответствующих VERSION=, мы удалим все, кроме двух последних слов. p ] в конце означает печать. perl perl -lne '/VERSION=.*\b(\w+ \w+)/ && print $1' /etc/os-release
-n означает «обрабатывать каждую строку ввода со сценарием, заданным -e». [F29] добавляет символ новой строки для каждого вызова печати (и некоторые другие вещи, которые здесь не представлены). Регулярное выражение соответствует последним двум словам (\b является границей слов) и печатает их, если строка содержит VERSION=. coreutils grep VERSION= /etc/os-release | cut -d ' ' -f 2- | tr -d '"'
Здесь мы просто grep соответствующую строку и используем cut, устанавливая разделитель полей на space (-d ' ') и печатая все, начиная со второго поля до конца строки. Команда tr -d удалит " с конца. Чистая оболочка (бесстыдно воровство @ умная идея source gniourf_gniourf): . /etc/os-release && echo ${VERSION//[0-9,. ]/ }
. источник файла, который делает переменные доступными для оболочки, и я использую возможности манипуляции с bash для удаления номеров версий. С помощью regex вы можете сделать это:
grep 'VERSION' /etc/os-release | grep -oP "[a-zA-Z]+ [a-zA-Z]+"
Это ищет строку с VERSION в файле /etc/os-release. Затем он находит 2 последовательных слова, разделенных пробелом (регулярное выражение Perl). Флаг -o сохраняет только то, что соответствует поиску.
Вы должны использовать [a-zA-Z] вместо `w`, чтобы не включать цифры.