从 /etc/debian_version 中查找 Debian 版本号的 Bash 脚本

Dan*_*s W 3 bash debian awk bash-script

以下是我目前用于测试 Debian 版本的内容。而不是这样做,我可以让它更简洁吗?

#!/bin/bash
VERSION=NONE
if [ $(cat /etc/debian_version) == '7.3' ]; then
  VERSION=7
elif [ $(cat /etc/debian_version) == '7.2' ]; then
  VERSION=7
elif [ $(cat /etc/debian_version) == '7.1' ]; then
  VERSION=7
elif [ $(cat /etc/debian_version) == '7.0' ]; then
  VERSION=7
fi
Run Code Online (Sandbox Code Playgroud)

我知道这不是最吸引人的方式。我想要的是了解如何使用文件 at/etc/debian_version读取之前的版本号.并忽略之后的版本号。

我尝试使用

if [ $(cat /etc/debian_version) == '7.*' ]; then
Run Code Online (Sandbox Code Playgroud)

我也试过

if [ $(cat /etc/debian_version) == '7.2|7.1|7.0' ]; then
Run Code Online (Sandbox Code Playgroud)

但这些都不适合我。我想将来证明我的脚本,这样如果 Debian 7.4 发布,那么我就不必回顾所有依赖于此的脚本并更改它们

我也知道lsb_release -a向我展示了相关信息,我只是不知道如何从中“剪切”我想要的内容并检查它是否是 Debian 6 或 7。正如您想象的那样,原始脚本很长.

您可以指向我的任何其他帖子,也将使用“切割”方法将响应分开以仅划分出我想要的部分,这也将不胜感激。

phe*_*mer 7

这是一个使用 bash 的解决方案,没有外部实用程序,并且是一次调用

read -d . VERSION < /etc/debian_version
Run Code Online (Sandbox Code Playgroud)

这会读取/etc/debian_version,拆分句点 ( .)上的输入,将句点之前的所有内容分配给VERSION并丢弃之后的所有内容。


IFS='.' read VERSION VERSION_MINOR < /etc/debian_version
Run Code Online (Sandbox Code Playgroud)

这略有不同,因为它保存了 VERSION_MINOR 中的句点之后的所有内容


IFS='.' read -a VERSION < /etc/debian_version
Run Code Online (Sandbox Code Playgroud)

这是最强大的,因为它在周期上拆分,并分配给数组$VERSION。如果版本是1.2.3那么${VERSION[0]} == 1 ${VERSION[1]} == 2和${VERSION[2]} == 3。


Joh*_*024 6

有很多方法可以做你想做的事。这个只是从版本号中删除小数点和后面的所有内容:

VERSION=$(sed 's/\..*//' /etc/debian_version)
Run Code Online (Sandbox Code Playgroud)

\..*表示句点 ( \.) 后跟零个或多个任意字符 ( .*)。因此,对于sed,表达式的s/\..*//意思是用空替换句号和后面的所有内容。sed命令的结果保存在环境变量中VERSION。

以上消除了对 if/then/elif/.../fi 语句的需要。它适用于 bash 和普通的 /bin/sh。

更多: sed是一个流编辑器:这意味着它从标准输入读取行,按照指令编辑它们,并且(通常)将它们发送到标准输出。在这种情况下,我们给它一个“替代”指令。例如,s/foo/bar/表示查找第一次出现的 foo 并将其替换为 bar。作为一种特殊情况,s/foo//意味着foo什么都不替换。在我们的例子中,我们想用空字符替换后跟任何字符的句点。现在,句号是“。” 除了sed通常将句点视为“任何字符”。所以,我们需要通过在它前面放一个反斜杠来“逃避”它。当sedsees 时\.,它知道我们的意思是字面意思。我们还想删除句点后面的任何字符。为了表示“任何字符”,我们使用句点.(无处可逃)。但是,一般来说,我们希望删除句点后面的所有字符,无论有多少。因此,在sed's 语言中,句点表示任何字符,星号表示“任意数量的前一个字符”(可能为零)。因此,period-star.*表示零个或多个任何字符。所以,把它们放在一起,s/\..*//告诉sed它如果找到一个句点,可能后面跟着任何东西,然后用空替换它。