我要做的事情 - > 我指定一个变量来检查某些事情是否属实,有时它有时候不是。
如果该变量为true,那么我希望它跳过else语句并打印出结果。 (一旦完全实现,它将返回resutlt到脚本而不是打印)
python代码:
import re
os_version = open('/etc/os-release')
for line in os_version:
OS = re.search(r'\AID_LIKE=\D[A-Za-z]+', line)
if OS:
print(str(OS.group()).lstrip('ID_LIKE="'))
else:
OS = re.search(r'\AID=\D[A-Za-z]+', line)
print(str(OS.group()).lstrip('ID="'))
当我像这样运行它时,我得到一个NoneType对象没有组
如果我在打印之前在else下缩进了if OS:语句,那么我得到两个结果,即使我有一个' break'第一次印刷后
取决于我运行的linux平台将取决于结果应该是什么。
示例(bash代码)
#!/bin/bash
VAR0=`cat /etc/os-release | grep -w ID_LIKE | cut -f2 -d= |\
tr -d [=\"=] | cut -f1 -d' '`
VAR0="${VAR0:=`cat /etc/os-release | grep -w ID | cut -f2 -d= |\
tr -d [=\"=]`}"
echo $VAR0
if [ "$VAR0" = 'debian' ]; then
echo 'DEBIAN based'
elif [ "$VAR0" = 'rhel' ]; then
echo 'RHEL based'
elif [ "$VAR0" = 'suse' ]; then
echo 'SUSE based'
else echo 'OTHER based'
fi
这是从bash代码返回的返回 - >
bash -o xtrace os-version.sh
++ cat /etc/os-release
++ grep -w ID_LIKE
++ cut -f2 -d=
++ tr -d '[="=]'
++ cut -f1 '-d '
+ VAR0=rhel
+ VAR0=rhel
+ echo rhel
rhel
+ '[' rhel = debian ']'
+ '[' rhel = rhel ']'
+ echo 'RHEL based'
RHEL based
来自不同的os->
bash -o xtrace test_2.sh
++ tr -d '[="=]'
++ cut -f1 '-d '
++ cut -f2 -d=
++ grep -w ID_LIKE
++ cat /etc/os-release
+ VAR0=
++ tr -d '[="=]'
++ grep -w ID
++ cut -f2 -d=
++ cat /etc/os-release
+ VAR0=debian
+ echo debian
debian
+ '[' debian = debian ']'
+ echo 'DEBIAN based'
DEBIAN based
你可以看到第一次运行的VAR0为空,然后转到第二次。
这是我尝试用python做的事情。
有人可以帮忙吗?我有一种感觉,我只是在屏幕上开始这么长时间之后忽略了一些简单的东西。感谢
EM
编辑joel:
我的代码现在和结果=> 代码:
#!/usr/bin/python3
import re
os_version = open('/etc/os-release')
for line in os_version:
OS = re.search(r'\AID_LIKE=\D[A-Za-z]+', line)
if OS:
print(str(OS.group()).lstrip('ID_LIKE="'))
break
else:
OS = re.search(r'\AID=\D[A-Za-z]+', line)
if OS:
print(str(OS.group()).lstrip('ID="'))
来自debian系统的结果=>
python test.os-version_2.py
debian
来自基于debian的系统=>
python test.os-version_2.py
raspbian
debian
来自centos7 =>
的结果python test.os-version_2.py
centos
rhel
来自opensuse =>
的结果python test.os-version_2.py
opensuse
suse
来自linuxmint的结果(我现在正在运行,即使它是基于ubuntu / debian的基础)=>
python test.os-version_2.py
linuxmint
因此,由于某些事情的反应不同,并且有很多不同的发行版基于一对夫妇,我试图将结果缩小到尽可能少。
每个人都有不同的方式来做事,并试图让跨平台的脚本尽可能地工作,我试图缩小范围。
如果你是cat / etc / os-release'你会看到不同的操作系统以不同的方式显示它们。
编辑答案:
我不知道为什么现在还有一个变量用于打印语句,然后打印它正在工作的变量。也许有人可以为我解答。
回答代码:
#!/usr/bin/python3
import re
os_version = open('/etc/os-release')
for line in os_version:
OS = re.search(r'\AID_LIKE=\D[A-Za-z]+', line)#.group()
if OS is not None:
base_distro = (str(OS.group()).lstrip('ID_LIKE="'))
else:
OS = re.search(r'\AID=\D[A-Za-z]+', line)#.group()
if OS is not None:
base_distro = (str(OS.group()).lstrip('ID="'))
print(base_distro)
如果您将其放入脚本中然后运行它,您将看到我正在寻找的内容。
感谢大家的帮助
答案 0 :(得分:1)
使用Python 2.7轻松获取系统平台,请参阅platform import
import platform
print platform.dist()[0],type(platform.dist()[0])
返回
debian <type 'str'>
在我的平台上。
澄清 -
OS = re.search(r'\AID_LIKE=\D[A-Za-z]+', line)
返回一个对象(NoneType)
注意“导入平台”将被折旧。下面是使用新方法的方法(只是一种基本方法,可能不适合所有情况,但它适用于我认为你所描述的 - 进行比较,只需在评论中使用dict
< / p>
编辑 - 超级简单的方法 - 如果平台不起作用,则使用子流程
import subprocess
output = subprocess.check_output(["cat", "etc/os-release"])
with open('text.txt', 'w+') as fd:
fd.write(output)
with open('text.txt', 'r') as text_output:
for os_version in text_output:
try:
print os_version.split("ID_LIKE=",1)[1]
except:
continue
这里我们只调用实际命令,将输出作为字符串,将其放入文件中,然后读取所有行,将行拼接在我们想要的关键词和bam!想要操作系统ID吗?然后添加print os_version.split("ID=",1)[1]
再次输出是: Debian的 树莓派