分页: 1 / 1

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

发表于 : 2020-01-02 9:24
百草谷居士
为知笔记提供了两个不同的appimage版本,一个对应到ubuntu1804之前的版本,一个对应到1804及以后的版本。
这两个AppImage我都下载到了同一个文件夹,我想写一个脚本,自动判断操作系统版本,然后启动不同的应用程序。
求助!

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

发表于 : 2020-01-02 9:38
astolia
请自行研究lsb_release的用法

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

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

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

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

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

可是我没有shell编程经验,不知道如何捕获输出信息,如何截取,如何做条件判断
好吧,我太懒了,希望熟悉的人直接给出代码
你这种行为叫伸手党!伸手党是要被*****的

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

发表于 : 2020-01-05 10:14
careone
我电脑是 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
}

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

发表于 : 2020-01-06 14:04
百草谷居士
谢谢!!shell语法好特别,没有看明白怎么回事。 有空自己拿python也写下。

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

发表于 : 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

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

发表于 : 2020-01-06 21:51
astolia
百草谷居士 写了:
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

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

发表于 : 2020-01-12 11:50
lilydjwg
百草谷居士 写了:
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 函数中调用。

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

发表于 : 2020-01-12 11:51
lilydjwg
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~

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

发表于 : 2020-01-12 14:44
astolia
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~
所以呢?就说了一个用$()替换``,在我这段代码里不换也没有任何问题

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

发表于 : 2020-01-12 15:23
lilydjwg
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 吗?

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

发表于 : 2020-01-12 17:04
astolia
lilydjwg 写了:
2020-01-12 15:23
没建议用 [[ 替换 [,以及 -e 吗?
为什么要用[[替换[?至少从15年前的3.0版起,[也是bash的内置命令了,以前那些要调用外部命令影响性能之类说法的早就进历史的垃圾堆了
至于-e,那也是按需使用,又不是不用不行。我这段里面又没有需要用它的地方

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

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