如何在 .sh (bash) 脚本中判断系统上的 Ubuntu 版本?

a.m*_*aei 11 command-line bash scripts

所以我正在尝试创建一个 bash/可执行文件,并且我需要知道系统上 Ubuntu 的版本号。我在网上找到的所有方法都包含lsb_release -r,但是我无法将其输出到变量中。

有什么方法可以获取当前版本的 Ubuntu 并将其另存为 shell 可执行文件中的变量?

Win*_*nix 24

Var=$(lsb_release -r)
echo "$Var"
Run Code Online (Sandbox Code Playgroud)

应该做的伎俩。

对于数字部分,只需添加以下内容:

NumOnly=$(cut -f2 <<< "$Var")
echo "$NumOnly"
Run Code Online (Sandbox Code Playgroud)

lsb-release变量文件

/usr/bin/lsb_release是一个 Python 脚本。这是一个简短的脚本,可以很好地介绍 Python 语言。正如其他人所提到的,获取版本号的更短方法是使用lsb_release -sr.

/etc/lsb-release文件定义了与lsb_release -a命令提供的信息相同的环境变量:

$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.6 LTS"
Run Code Online (Sandbox Code Playgroud)

您可以随时使用. /etc/lsb-release. 要在您的终端中进行测试:

$ . /etc/lsb-release

$ echo $DISTRIB_RELEASE
16.04

$ echo $DISTRIB_DESCRIPTION
Ubuntu 16.04.6 LTS
Run Code Online (Sandbox Code Playgroud)

  • @a.mosallaei 提醒一句 - 如果您只是使用数字部分而忽略其他所有内容,则此脚本在任何非 Ubuntu 机器上都会产生奇怪的结果(包括许多与 Ubuntu“兼容”的基于 Ubuntu 的发行版)但有自己的名字和版本);在使用该数字之前,您可能需要验证 lsb_release 结果是否以“Ubuntu”开头。 (4认同)

ter*_*don 11

另一种方法是使用该/etc/os-release文件。这被格式化为一个 shell 变量列表:

$ cat /etc/os-release 
NAME="Ubuntu"
VERSION="18.04.2 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.2 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic
Run Code Online (Sandbox Code Playgroud)

所以解析它的一种简单方法是简单source的文件:

$ . /etc/os-release

$ echo $NAME
Ubuntu

$ echo $VERSION
18.04.2 LTS (Bionic Beaver)

$ echo $PRETTY_NAME
Ubuntu 18.04.2 LTS


$ echo $VERSION_ID
18.04
Run Code Online (Sandbox Code Playgroud)

为避免不必要地设置所有这些变量,您可以在subshel​​l 中获取文件,回显您需要的变量并退出 subshel​​l:

$ ( . /etc/os-release ; echo $VERSION_ID)
18.04
Run Code Online (Sandbox Code Playgroud)

或者,您始终可以直接解析文件:

$ grep -oP 'VERSION_ID="\K[\d.]+' /etc/os-release 
18.04
Run Code Online (Sandbox Code Playgroud)

  • 请注意,对于 Ubuntu 衍生品,版本信息可能指的是下游版本(例如,我的 Mint 盒子有 VERSION_ID="18.3" 和 VERSION_CODENAME="sylvia")。不过 UBUNTU_CODENAME 应该是正确的。 (2认同)

Eli*_*gan 8

lsb_release命令支持-s(或--short) 选项以仅打印您要求的信息,而不是说明信息类型的标题。

要获得版本号,运行以下命令就足够了:

lsb_release -sr
Run Code Online (Sandbox Code Playgroud)

例如,在 Ubuntu 18.04 LTS 上,输出:

18.04
Run Code Online (Sandbox Code Playgroud)

WinEunuuchs2Unix's answer 中的方法一样,使用命令替换将此输出分配给 shell 变量仍然是合理的。假设您希望ver变量保存版本号:

ver="$(lsb_release -sr)"
Run Code Online (Sandbox Code Playgroud)

使用-s,无需使用cutsedgrepawk、更复杂的参数扩展形式等来解析数字。

在这种用法中," "引号是可选的,但我通常建议引用参数扩展和其他shell 扩展,除非有理由不这样做。


Kul*_*lfy 5

简短而简单的lsb_release命令。

关于这里使用的标志:

-s   show requested information in short format
-r   show release number of this distribution
-d   show description of this distribution
Run Code Online (Sandbox Code Playgroud)