如何使用shell脚本查找Linux发行版名称?

10

我正在编写一个shell脚本,在其中需要当前操作系统的名称以使其通用。例如:

if [ $Operating_System == "CentOS" ]
then
    echo "CentOS";
    # Do this
elif [ $Operating_System == "Ubuntu" ]
then
    echo "Ubuntu";
    # Do that
else
    echo "Unsupported Operating System";
fi

如何实现呢?应该使用正则表达式对lsb_release -a命令进行匹配还是其他方法?谢谢。

是的 - lsb-release 绝对是最强大和通用的方法。例如:lsb_release -d|awk '{print $2}' - FoggyDay
或者 lsb_release -ds - Cyrus
在CENTOS7中,lsb_release似乎不是开箱即用的。 - Axel Werner
7个回答

9
$ lsb_release -i
Distributor ID: Fedora
$ lsb_release -i | cut -f 2-
Fedora

4
然而,在CentOS 7上不存在lsb_release命令。 - Mithril

7
你可以通过lsb_release命令获取相关信息:
echo "$(lsb_release -is)"

i代表分配商id。

s代表简短。

例如。它显示Ubuntu而不是Distributor Id: Ubuntu

还有其他选项:

-r:版本

-d:描述

-c:代号

-a:全部

您可以通过运行lsb_release --helpman lsb_release来获取此信息。


4

编辑2: 正如@Jean-Michaël Celerier指出的那样,一些发行版更喜欢添加双引号。

这个例子...

awk -F'=' '/^ID=/ { gsub("\"","",$2); print tolower($2) }' /etc/*-release 2> /dev/null

... and this one ...

(awk -F'=' '/^ID=/ { print tolower($2) }' /etc/*-release | tr -d '"') 2> /dev/null

...可以用来删除它们。

编辑1: 如@S0AndS0所建议的,这样略微更好:

awk -F'=' '/^ID=/ {print tolower($2)}' /etc/*-release 2> /dev/null

尝试这个:
awk '/^ID=/' /etc/*-release | awk -F'=' '{ print tolower($2) }'

1
这几乎是完美的,不需要在awk之间进行管道操作,因为awk -F'=' '/^ID=/ {print tolower($2)}' /etc/*-release已经足够了。对于那些想要基于Debian检测发行版的人来说,awk -F'=' '/^ID_LIKE=/ {print tolower($2)}' /etc/*-release 2>/dev/null更接近于我的用例的完美。 - S0AndS0
1
小改进:删除一些发行版(如opensuse)添加的引号:awk -F'=' '/^ID=/ { gsub("\"","",$2); print tolower($2) } ' /etc/*-release 2> /dev/null - Jean-Michaël Celerier

3
DISTRO=$( cat /etc/*-release | tr [:upper:] [:lower:] | grep -Poi '(debian|ubuntu|red hat|centos|nameyourdistro)' | uniq )
if [ -z $DISTRO ]; then
    DISTRO='unknown'
fi
echo "Detected Linux distribution: $DISTRO"

1
对于几乎所有的Linux发行版,cat /etc/issue都可以解决问题。
编辑:显然,没有一种解决方案适用于所有发行版,因为发行版有自己的想法。
进一步澄清:这并不能保证100%有效 - 没有什么是绝对的 - 但我个人经验表明,这是最常用的方法。实际上,这是唯一一种始终有效的方法(在此提到的lsb_release经常会产生command not found)。

1
“/etc/issue” 不是用于存储关于操作系统的信息,可能包含管理员喜欢的任何文本。我绝不会信任它来检测操作系统或发行版。 - Sami Kuhmonen
1
具体来说,/etc/issue 是由 getty 在控制台登录时显示的文本文件。它不能保证包含有关发行版的任何有意义的信息。 - user149341
3
通常我会执行 cat /etc/*ease 命令,因为 /etc 目录中有一个名为 fedora-releasesomething-release 的文件。 - fedorqui
这不是一个可靠的解决方案,因为这些文件是供管理员随意放置的。 - Axel Werner

0

这是我得到的:

#!/bin/bash

dist=$(tr -s ' \011' '\012' < /etc/issue | head -n 1)

check_arch=$(uname -m)

echo "[$green+$txtrst] Distribution Name: $dist"

-3

我会使用uname -a

robert@debian:/tmp$ uname -a
Linux debian 3.2.0-4-686-pae #1 SMP Debian 3.2.65-1+deb7u2 i686 GNU/Linux

为什么被踩了? - David Alsh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接