请教shell脚本:判断系统版本,启动不同应用

sh/bash/dash/ksh/zsh等Shell脚本
回复
头像
百草谷居士
帖子: 3918
注册时间: 2006-02-10 16:36
系统: Mint21.1/Deepin20.8

请教shell脚本:判断系统版本,启动不同应用

#1

帖子 百草谷居士 » 2020-01-02 9:24

为知笔记提供了两个不同的appimage版本,一个对应到ubuntu1804之前的版本,一个对应到1804及以后的版本。
这两个AppImage我都下载到了同一个文件夹,我想写一个脚本,自动判断操作系统版本,然后启动不同的应用程序。
求助!
debian 12 / 深度系统 20.9 / Mint 21.3

为何热衷于搞发行版的多,搞应用程序开发的少?Linux最多余的就是各种发行版,最缺的就是应用程序,特别是行业应用程序。
头像
astolia
论坛版主
帖子: 6431
注册时间: 2008-09-18 13:11

Re: 请教shell脚本:判断系统版本,启动不同应用

#2

帖子 astolia » 2020-01-02 9:38

请自行研究lsb_release的用法
头像
百草谷居士
帖子: 3918
注册时间: 2006-02-10 16:36
系统: Mint21.1/Deepin20.8

Re: 请教shell脚本:判断系统版本,启动不同应用

#3

帖子 百草谷居士 » 2020-01-02 11:48

使用 lsb_release -r 可以输出当前系统版本号。

可是我没有shell编程经验,不知道如何捕获输出信息,如何截取,如何做条件判断
好吧,我太懒了,希望熟悉的人直接给出代码
debian 12 / 深度系统 20.9 / Mint 21.3

为何热衷于搞发行版的多,搞应用程序开发的少?Linux最多余的就是各种发行版,最缺的就是应用程序,特别是行业应用程序。
onlylove
论坛版主
帖子: 5228
注册时间: 2007-01-14 16:23

Re: 请教shell脚本:判断系统版本,启动不同应用

#4

帖子 onlylove » 2020-01-02 11:56

百草谷居士 写了: 2020-01-02 11:48 使用 lsb_release -r 可以输出当前系统版本号。

可是我没有shell编程经验,不知道如何捕获输出信息,如何截取,如何做条件判断
好吧,我太懒了,希望熟悉的人直接给出代码
你这种行为叫伸手党!伸手党是要被*****的
头像
careone
帖子: 839
注册时间: 2007-12-17 21:41

Re: 请教shell脚本:判断系统版本,启动不同应用

#5

帖子 careone » 2020-01-05 10:14

我电脑是 Debian, 无法确认 ubuntu 的 lsb_release 相关输出细节。先试运行,看输出是否正常。反馈时,请提供输出信息和相关必要细节

把第8,9行的两个数组值 appname, 改成要运行的两种版本对应的可执行文件。包括文件名和完整路径。

代码: 全选

#!/bin/bash
# original filename: run-by-verion.sh
OS_ID=`lsb_release -si` #sample: Debian
OS_VER=`lsb_release -sr` #sample: 10

OS_CODE=`lsb_release -sc` #sample: 10

declare -a appname
appname[0]="/usr/local/bin/app_old"
appname[1]="/usr/local/bin/app_u1804"

## debug datas ##
##appname[0]="lsb_release -i"
##appname[1]="lsb_release -r"

### body ###
#echo " check OS version: $OS_ID $OS_VER ($OS_CODE)"
echo " check OS version: "
echo
lsb_release -a

if [ "$OS_ID" = Ubuntu ]; then

	case "$OS_VER"  in
	  1[0-7].[0-1][0-9] | [4-9].[0-1][0-9] )
	        ${appname[0]}
		;;
	  18.04 | [1-9][4-9].[0-1][0-9])
	        ${appname[1]}
		;;
	  *)    echo " Warnning 1: Unknown OS version ($OS_VER)" 1>&2
   	        ${appname[1]}
		;;
	esac

elif [ "$OS_ID" = Debian ];  then

	case "$OS_VER"  in
	  [0-9] |  [1-9][0-9])
	        ${appname[1]}
		;;
	  *)    echo " Warnning 2: Unknown OS version ($OS_VER)" 1>&2
   	        ${appname[1]}
		;;
	esac

else
   echo " Error 3: Unkonw OS and version. quit" 1>&2
   exit 1;
fi

exit 0;

#
	_show_option_a () {
cat<<EOF
$ lsb_release -a

No LSB modules are available.
Distributor ID:	Debian
Description:	Debian GNU/Linux 10 (buster)
Release:	10
Codename:	buster
 ----
lsb_release -h
Usage: lsb_release [options]

Options:
  -h, --help         show this help message and exit
  -v, --version      show LSB modules this system supports
  -i, --id           show distributor ID
  -d, --description  show description of this distribution
  -r, --release      show release number of this distribution
  -c, --codename     show code name of this distribution
  -a, --all          show all of the above information
  -s, --short        show requested information in short format

EOF
}
魁拔不死,天下不宁。
魁拔既死,天下不平。
--------------
Careone <emacslocale^126.com>
https://sourceforge.net/projects/emacslocale/files/
头像
百草谷居士
帖子: 3918
注册时间: 2006-02-10 16:36
系统: Mint21.1/Deepin20.8

Re: 请教shell脚本:判断系统版本,启动不同应用

#6

帖子 百草谷居士 » 2020-01-06 14:04

谢谢!!shell语法好特别,没有看明白怎么回事。 有空自己拿python也写下。
debian 12 / 深度系统 20.9 / Mint 21.3

为何热衷于搞发行版的多,搞应用程序开发的少?Linux最多余的就是各种发行版,最缺的就是应用程序,特别是行业应用程序。
头像
百草谷居士
帖子: 3918
注册时间: 2006-02-10 16:36
系统: Mint21.1/Deepin20.8

Re: 请教shell脚本:判断系统版本,启动不同应用

#7

帖子 百草谷居士 » 2020-01-06 20:58

代码: 全选

#!/usr/bin/env python3
import os
getver='lsb_release -sr'
newcmd='~/opt/WizNote/WizNote-2.7.9-x86_64-ubuntu-18.04.AppImage'
oldcmd='~/opt/WizNote/WizNote-2.7.9-x86_64.AppImage'
info=os.popen(getver).readline()
ver=info.strip('\r\n')
if float(ver)>=18.04 :
    os.system(newcmd)
else:
    os.system(oldcmd)

和python比起来,shell语法简直是变态 :Angry
debian 12 / 深度系统 20.9 / Mint 21.3

为何热衷于搞发行版的多,搞应用程序开发的少?Linux最多余的就是各种发行版,最缺的就是应用程序,特别是行业应用程序。
头像
astolia
论坛版主
帖子: 6431
注册时间: 2008-09-18 13:11

Re: 请教shell脚本:判断系统版本,启动不同应用

#8

帖子 astolia » 2020-01-06 21:51

百草谷居士 写了: 2020-01-06 20:58 和python比起来,shell语法简直是变态 :Angry
变态吗?

代码: 全选

#!/bin/bash
VER=`lsb_release -sr`
if [ "${VER%.*}" -lt 18 ]; then
	~/opt/WizNote/WizNote-2.7.9-x86_64.AppImage
else
	~/opt/WizNote/WizNote-2.7.9-x86_64-ubuntu-18.04.AppImage	
fi
头像
lilydjwg
论坛版主
帖子: 4249
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: 请教shell脚本:判断系统版本,启动不同应用

#9

帖子 lilydjwg » 2020-01-12 11:50

百草谷居士 写了: 2020-01-06 20:58

代码: 全选

#!/usr/bin/env python3
import os
getver='lsb_release -sr'
newcmd='~/opt/WizNote/WizNote-2.7.9-x86_64-ubuntu-18.04.AppImage'
oldcmd='~/opt/WizNote/WizNote-2.7.9-x86_64.AppImage'
info=os.popen(getver).readline()
ver=info.strip('\r\n')
if float(ver)>=18.04 :
    os.system(newcmd)
else:
    os.system(oldcmd)

和python比起来,shell语法简直是变态 :Angry
不建议使用 #!/usr/bin/env python3,因为很多人用虚拟环境,你不知道你的脚本会被哪个 Python 解释器执行。虽然你这段脚本没有依赖,不会出问题。

不建议使用 os.popen。请使用 subprocess.check_output。

不建议使用 os.system。请使用 subprocess.check_call。

建议将代码放到一个 main 函数中调用。
头像
lilydjwg
论坛版主
帖子: 4249
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: 请教shell脚本:判断系统版本,启动不同应用

#10

帖子 lilydjwg » 2020-01-12 11:51

astolia 写了: 2020-01-06 21:51
百草谷居士 写了: 2020-01-06 20:58 和python比起来,shell语法简直是变态 :Angry
变态吗?

代码: 全选

#!/bin/bash
VER=`lsb_release -sr`
if [ "${VER%.*}" -lt 18 ]; then
	~/opt/WizNote/WizNote-2.7.9-x86_64.AppImage
else
	~/opt/WizNote/WizNote-2.7.9-x86_64-ubuntu-18.04.AppImage	
fi
建议跑一下 shellcheck O(∩_∩)O~
头像
astolia
论坛版主
帖子: 6431
注册时间: 2008-09-18 13:11

Re: 请教shell脚本:判断系统版本,启动不同应用

#11

帖子 astolia » 2020-01-12 14:44

lilydjwg 写了: 2020-01-12 11:51
astolia 写了: 2020-01-06 21:51
百草谷居士 写了: 2020-01-06 20:58 和python比起来,shell语法简直是变态 :Angry
变态吗?

代码: 全选

#!/bin/bash
VER=`lsb_release -sr`
if [ "${VER%.*}" -lt 18 ]; then
	~/opt/WizNote/WizNote-2.7.9-x86_64.AppImage
else
	~/opt/WizNote/WizNote-2.7.9-x86_64-ubuntu-18.04.AppImage	
fi
建议跑一下 shellcheck O(∩_∩)O~
所以呢?就说了一个用$()替换``,在我这段代码里不换也没有任何问题
头像
lilydjwg
论坛版主
帖子: 4249
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: 请教shell脚本:判断系统版本,启动不同应用

#12

帖子 lilydjwg » 2020-01-12 15:23

astolia 写了: 2020-01-12 14:44
lilydjwg 写了: 2020-01-12 11:51
astolia 写了: 2020-01-06 21:51
百草谷居士 写了: 2020-01-06 20:58 和python比起来,shell语法简直是变态 :Angry
变态吗?

代码: 全选

#!/bin/bash
VER=`lsb_release -sr`
if [ "${VER%.*}" -lt 18 ]; then
	~/opt/WizNote/WizNote-2.7.9-x86_64.AppImage
else
	~/opt/WizNote/WizNote-2.7.9-x86_64-ubuntu-18.04.AppImage	
fi
建议跑一下 shellcheck O(∩_∩)O~
所以呢?就说了一个用$()替换``,在我这段代码里不换也没有任何问题
是没啥问题啊。
没建议用 [[ 替换 [,以及 -e 吗?
头像
astolia
论坛版主
帖子: 6431
注册时间: 2008-09-18 13:11

Re: 请教shell脚本:判断系统版本,启动不同应用

#13

帖子 astolia » 2020-01-12 17:04

lilydjwg 写了: 2020-01-12 15:23 没建议用 [[ 替换 [,以及 -e 吗?
为什么要用[[替换[?至少从15年前的3.0版起,[也是bash的内置命令了,以前那些要调用外部命令影响性能之类说法的早就进历史的垃圾堆了
至于-e,那也是按需使用,又不是不用不行。我这段里面又没有需要用它的地方
头像
lilydjwg
论坛版主
帖子: 4249
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: 请教shell脚本:判断系统版本,启动不同应用

#14

帖子 lilydjwg » 2020-01-12 23:01

astolia 写了: 2020-01-12 17:04
lilydjwg 写了: 2020-01-12 15:23 没建议用 [[ 替换 [,以及 -e 吗?
为什么要用[[替换[?至少从15年前的3.0版起,[也是bash的内置命令了,以前那些要调用外部命令影响性能之类说法的早就进历史的垃圾堆了
至于-e,那也是按需使用,又不是不用不行。我这段里面又没有需要用它的地方
当然不是不用不行。我只是习惯写更好的代码,即使它在某些个例中并不是更好。
[[ 是关键字,[ 是普通命令。解析上有区别(具体不太记得了)。另外 [[ 里可以用 && ||。
回复