【Shell】测试脚本
创始人
2025-05-30 00:10:23

FC600测试脚本

  • 测试脚本
  • 脚本格式
    • 二级目录
  • 第一个Shell脚本
  • 执行方式
    • 1. bash或sh+脚本的相对路径或绝对路径
    • 2. 输入脚本的绝对路径或相对路径
    • 3.

测试脚本

#!/bin/bash
#运行脚本会列出which命令查不到的命令工具MISS信息varPathCur=$(cd `dirname $0`; pwd)declare -i varError_busybox
varError_busybox=0
errMsg_busybox=""declare -i varError_base
varError_base=0
declare -i varNum_base
varNum_base=0
errMsg_base=""declare -i varError_ext
varError_ext=0
declare -i varNum_ext
varNum_ext=0
errMsg_ext=""printResult(){ if [ $varError_busybox -eq 0 ]thenecho -e "\033[32m busybox版本测试结论: OK. \033[0m\n"elseecho -e "\033[31m busybox版本测试结论:异常,其中异常为:\n$errMsg_busybox \033[0m\n"fiif [ $varError_base -eq 0 ]thenecho -e "\033[32m 基础工具集测试结论: OK. 共$varNum_base条指令,正常$varNum_base条 \033[0m\n"elsevarOk_base=$(($varNum_base-varError_base))echo -e "\033[31m 基础工具集测试结论:异常,共$varNum_base条指令,正常$varOk_base条,异常$varError_base条,其中异常为:\n$errMsg_base \033[0m\n"fiif [ $varError_ext -eq 0 ]thenecho -e "\033[32m 扩展工具集测试结论: OK. 共$varNum_ext条指令,正常$varNum_ext条 \033[0m\n"else	varOk_ext=$(($varNum_ext-varError_ext))echo -e "\033[31m 扩展工具集测试结论:异常,共$varNum_ext条指令,正常$varOk_ext条,异常$varError_ext条,其中异常为:\n$errMsg_ext \033[0m\n"fi	
}testBusyboxVersion(){varTool=busyboxvarResult=` which $varTool `xif [ $varResult = x ];thenvarError_busybox=$(($varError_busybox+1)) echo -e "\033[31m 异常: 没有$varTool \033[0m"errMsg_busybox="$errMsg_busybox\033[31m $varError_busybox. 没有 $varTool \033[0m\n"else#软件版本检测varResult=` busybox --help `varResult=${varResult#"BusyBox v"}varVersion=${varResult:0:6}varDefVer="1.34.1"if [ "$varVersion" != "$varDefVer" ]thenvarError_busybox=$(($varError_busybox+1)) echo -e "\033[31m 异常! $varTool 版本是 $varVersion, 不符合测试要求($varDefVer)\033[0m"errMsg_busybox="$errMsg_busybox\033[31m $varError_busybox. $varTool 版本是 $varVersion, 不符合测试要求($varDefVer) \033[0m\n"elseecho -e "\033[32m 正确: $varTool 版本是 $varVersion\033[0m"	fifi	
}testBusybox(){echo -e "开始测试基础工具集: \r"for varTool in adduser date free groupdel groupmod id kill last lastb login logrotate newgrp nice ps reboot renice rlogin shutdown su top uname useradd userdel usermod who whoami chroot crontab dmesg insmod lsmod passwd rmmod vi grep ar bunzip2 bzip2 gunzip gzip tar unzip zip diff file find ln ls mv touch whereis which cat chmod chown cksum cp ssh scp sftp df du pwd rmdir stat umount dd fsck.ext4 fdisk mkfs.ext4 swapoff swapon sync ifconfig nc netstat ping tcpdump traceroute systemctl journalctl nandwrite flashcp mtdinfo pstreedovarNum_base=$(($varNum_base+1)) varResult=` which $varTool `xif [ $varResult = x ];thenvarError_base=$(($varError_base+1)) echo -e "\033[31m 缺失工具: $varTool \033[0m"errMsg_base="$errMsg_base\033[31m $varError_base. 缺失工具: $varTool \033[0m\n"elsevarResult=` which $varTool `echo -e "\033[32m 正确: $varTool 路径->$varResult \033[0m"#不是存在可执行文件就可以, 有些是到Busybox的链接, 但是Busybox里实际并没有支持, 会打印applet not foundvarResult="`$varTool --help 2>&1 | grep 'applet not found'`"if [ "$varResult" != "" ]then#echo "$varResult"varError_base=$(($varError_base+1)) echo -e "\033[31m 异常: $varTool 存在, 但不能执行 \033[0m"errMsg_base="$errMsg_base\033[31m $varError_base. $varTool 存在, 但不能执行 \033[0m\n"fifidone
}#测试shell内建命令, $1执行命令, $2应当返回值, $3程序名称
function testShellBuildInCmd(){varNum_base=$(($varNum_base+1))echo -e "$1" > /tmp/test.shchmod +x /tmp/test.sh/tmp/test.sh >/dev/null 2>&1retVal=$?if [ $retVal -eq $2 ]thenecho -e "\033[32m 正确: $3 \033[0m"elsevarError_base=$(($varError_base+1)) echo -e "\033[31m 异常: $3, 指令: $1, 返回值: $retVal \033[0m"errMsg_base="$errMsg_base\033[31m $varError_base. $1 指令, 返回值错误 \033[0m\n"fi
}#测试shell命令
testShell(){#echo -e "开始测试shell工具集: \r"testShellBuildInCmd "exit 200" 200 "exit"testShellBuildInCmd "logout" 1 "logout"testShellBuildInCmd "ulimit" 0 "ulimit"testShellBuildInCmd "cd /tmp" 0 "cd"#testShellBuildInCmd "cd -" 1 "cd test2"testShellBuildInCmd "pidof systemd" 0 "systemd"  #当前应当有systemd运行echo -e "--------------------------------------------------------------- \r\n"
}#测试扩展命令, $1扩展命令, $2存放路径, $3建议最低版本,$4获取指令版本的方法,$5字符串截取方向(1从尾部截取),$6版本字符串截取,$7版本号长度,$8版本号列数
function testExtCmd(){varNum_ext=$(($varNum_ext+1))#echo $1;echo $2;echo $3;echo $4;echo $5;echo $6;varTool=$1varResult=` which $varTool `xif [ $varResult = x ];thenvarError_ext=$(($varError_ext+1)) echo -e "\033[31m 缺失工具: $varTool \033[0m"errMsg_ext="$errMsg_ext\033[31m $varError_ext. 缺失工具: $varTool \033[0m\n"elsedeclare -i err_patherr_path=0declare -i err_vererr_ver=0#存放路径检测varResult=` which $varTool `varPath=${varResult%$varTool}# varDefPath=$2varDefPath="/usr/sbin/"varDefPath1="/usr/bin/"#软件版本检测varDefMinVer=$3varCmdResult=$4if [ $5 -eq 1 ]thenvarVersion=${varCmdResult: -$(($7))}elsevarCmdResult=${varCmdResult#$6}varVersion=${varCmdResult:0:$(($7))}fiif [ "$varPath" = "$varDefPath" ] || [ "$varPath" = "$varDefPath1" ]thenecho -e "\033[32m 正确: $varTool 路径->$varPath\033[0m"	elseerr_path=$(($err_path+1))echo -e "\033[31m 异常! $varTool 路径是 $varPath, 不符合测试要求($varDefPath or $varDefPath1)\033[0m"fiif [ -z "$varVersion" ]thenvarError_ext=$(($varError_ext+1)) echo $varTool | awk '{printf "\033[31m 异常! 无法获取 %s 的版本号 \033[0m\n", $1}'	if [ $err_path -eq 1 ]thenerrMsg_ext="$errMsg_ext\033[31m $varError_ext. $varTool 路径是 $varPath, 不符合测试要求($varDefPath)。\033[0m"errMsg_ext="$errMsg_ext\033[31m 并且无法获取 $varTool 的版本号 \033[0m\n"elseerrMsg_ext="$errMsg_ext\033[31m $varError_ext. 无法获取 $varTool 的版本号 \033[0m\n"	fielse#以"."分隔,取出版本号每个列的值,为了简单起见,认为版本号的列数不会超过3 vd=(1 2 3)vd[0]=`echo $varDefMinVer|awk -F . '{print $1}'`  vd[1]=`echo $varDefMinVer|awk -F . '{print $2}'`vd[2]=`echo $varDefMinVer|awk -F . '{print $3}'` 			vv=(1 2 3)vv[0]=`echo $varVersion|awk -F . '{print $1}'`  vv[1]=`echo $varVersion|awk -F . '{print $2}'`vv[2]=`echo $varVersion|awk -F . '{print $3}'`col=$8for ((i=0; i/dev/null then if [ ${vv[i]} -lt ${vd[i]} ];thenerr_ver=$(($err_ver+1))echo $varVersion $varDefMinVer $varTool | awk '{printf "\033[31m 异常! %s 版本号是 %s, 低于测试要求(%s)\033[0m\n", $3, $1, $2}'	breakelif [ ${vv[i]} -gt ${vd[i]} ];thenbreakfielsebreak		#非数字就不要比较了	fi	doneif [ $err_ver -eq 0 ]thenecho -e "\033[32m 正确: $varTool 版本号->$varVersion\033[0m"	fiif [ $err_path -eq 1 ] || [ $err_ver -eq 1 ]thenvarError_ext=$(($varError_ext+1)) errMsg_ext="$errMsg_ext\033[31m $varError_ext. \033[0m"if [ $err_ver -eq 1 ]thenerrMsg_ext="$errMsg_ext\033[31m $varTool 版本号是 $varVersion, 低于测试要求($varDefMinVer) \033[0m"fiif [ $err_path -eq 1 ]thenerrMsg_ext="$errMsg_ext\033[31m $varTool 路径是 $varPath, 不符合测试要求($varDefPath) \033[0m"fi	errMsg_ext="$errMsg_ext\n"				fi	fifi
}#测试扩展工具集的版本和存放路径
testExt(){echo -e "开始测试扩展工具集: \r"testExtCmd sshd				"/usr/sbin/" 	"7.6" 		"`ssh -V 2>&1`" 				0	"OpenSSH_" 							3	2testExtCmd mosquitto	"/usr/sbin/" 	"1.6.15" 	"`mosquitto -h 2>&1`" 	0	"mosquitto version " 		6	3testExtCmd e2fsck			"/usr/sbin/" 	"1.46.5" 	"`e2fsck -V 2>&1`" 			0	"e2fsck " 							6	3#testExtCmd dropbear		"/usr/sbin/" 	"2022.82" "`dropbear -V 2>&1`" 		0	"Dropbear v" 						7	2testExtCmd sqlite3		"/usr/bin/" 	"3.38.2" 	"`sqlite3 -version`" 		0	"" 											6	3testExtCmd mmc				"/usr/sbin/" 	"0.1"		 	"`mmc -h`"					 		1	"" 											3	2testExtCmd pppd				"/usr/bin/" 	"2.4.8" 	"`pppd --help 2>&1`" 		0	"pppd version " 				5	3#chat 没有专门查版本的参数,是pppd的附属testExtCmd chat				"/usr/bin/" 	"2.4.8" 	"`pppd --help 2>&1`" 		0	"pppd version " 				5	3testExtCmd rz					"/usr/bin/" 	"0.12.20"	"`rz -h`" 							0	"rz version " 					7	3testExtCmd sz					"/usr/bin/" 	"0.12.20"	"`sz -h`" 							0	"sz version " 					7	3testExtCmd stress			"/usr/bin/" 	"1.0.4"		"`stress --version`"		0	"stress "			 					5	3testExtCmd rsyslogd		"/usr/sbin/" 	"8.16.0"	"`rsyslogd -v`"					0	"rsyslogd  "			 			8	3testExtCmd gdb				"/usr/bin/" 	"11.2"		"`gdb --version`"				0	"GNU gdb (GDB) "	 			4	2testExtCmd gdbserver	"/usr/bin/" 	"11.2"		"`gdbserver --version`"	0	"GNU gdbserver (GDB) "	4	2#ss版本,有的是iproute2-ss1612,有的是iproute2-5.14.0,格式不一样,这里取后者的格式testExtCmd ss					"/usr/bin/" 	"5.14.0"	"`ss --version`"				0	"ss utility, iproute2-"	6	3testExtCmd strace			"/usr/bin/" 	"5.5"			"`strace -V`"						0	"strace -- version "		4	2echo -e "--------------------------------------------------------------- \r\n"
}testBusyboxVersion
testBusybox
testShell
testExt
printResult

脚本格式

脚本以/bin/bash开头(指定解析器)

二级目录

#! 是一个约定的标记,告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell。其后路径所指定的程序即是解释此脚本文件的 Shell 程序。

第一个Shell脚本

root@ubuntu:/home/yys# mkdir scripts
root@ubuntu:/home/yys# cd scripts
root@ubuntu:/home/yys/scripts# touch hello.sh
root@ubuntu:/home/yys/scripts# vim hello.sh

若出现如下报错:

The program 'vim' can be found in the following packages:* vim* vim-gnome* vim-tiny* vim-athena* vim-gtk* vim-nox
Try: sudo apt-get install 

解决方法
界面如下在这里插入图片描述
输入

#!/bin/bash
echo "hello world!"

第一个Shell脚本就写好了,输入命令:wq保存并退出
若输入时出现报错E348:No string under cursor
解决方法

执行方式

1. bash或sh+脚本的相对路径或绝对路径

当前目录下输入命令bash [filename]
在这里插入图片描述
其他目录下,输入相对路径执行bash scripts/[filename]
在这里插入图片描述
或使用绝对路径
在这里插入图片描述

2. 输入脚本的绝对路径或相对路径

  1. 赋予脚本的+x权限
    chmod +x [filename]
    在这里插入图片描述

有可执行权限时文件名变为绿色

  1. 执行脚本
    相对路径
    其中 . 指当前工作目录
    在这里插入图片描述
    绝对路径
    在这里插入图片描述

注意:必须具有可执行权限,即+x,否则报错
在这里插入图片描述
查看文件权限的方法

3.

在这里插入图片描述

在这里插入图片描述
source. 是bash shell的内部命令
在这里插入图片描述

前两种方式是在当前shell打开一个子shell脚本来执行脚本内容,当脚本内容结束则关闭子shell,回到父shell中。

第三种方式可以使脚本内容在当前shell里执行,而无需打开子shell。这也是每次修改完/etc/profile后,需要source的原因。

两者的区别在于环境变量的继承关系,如在子shell中设置的当前变量,父shell是不可见的。

相关内容

热门资讯

【实验报告】实验一 图像的... 实验目的熟悉Matlab图像运算的基础——矩阵运算;熟悉图像矩阵的显示方法࿰...
MATLAB | 全网最详细网... 一篇超超超长,超超超全面网络图绘制教程,本篇基本能讲清楚所有绘制要点&#...
大模型落地比趋势更重要,NLP... 全球很多人都开始相信,以ChatGPT为代表的大模型,将带来一场NLP领...
Linux学习之端口、网络协议... 端口:设备与外界通讯交流的出口 网络协议:   网络协议是指计算机通信网...
kuernetes 资源对象分... 文章目录1. pod 状态1.1 容器启动错误类型1.2 ImagePullBackOff 错误1....
STM32实战项目-数码管 程序实现功能: 1、上电后,数码管间隔50ms计数; 2、...
TM1638和TM1639差异... TM1638和TM1639差异说明 ✨本文不涉及具体的单片机代码驱动内容,值针对芯...
Qt+MySql开发笔记:Qt... 若该文为原创文章,转载请注明原文出处 本文章博客地址:https://h...
Java内存模型中的happe... 第29讲 | Java内存模型中的happen-before是什么? Java 语言...
《扬帆优配》算力概念股大爆发,... 3月22日,9股封单金额超亿元,工业富联、鸿博股份、鹏鼎控股分别为3.0...
CF1763D Valid B... CF1763D Valid Bitonic Permutations 题目大意 拱形排列࿰...
SQL语法 DDL、DML、D... 文章目录1 SQL通用语法2 SQL分类3 DDL 数据定义语言3.1 数据库操作3.2 表操作3....
文心一言 VS ChatGPT... 3月16号,百度正式发布了『文心一言』,这是国内公司第一次发布类Chat...
CentOS8提高篇5:磁盘分...        首先需要在虚拟机中模拟添加一块新的硬盘设备,然后进行分区、格式化、挂载等...
Linux防火墙——SNAT、... 目录 NAT 一、SNAT策略及作用 1、概述 SNAT应用环境 SNAT原理 SNAT转换前提条...
部署+使用集群的算力跑CPU密... 我先在开头做一个总结,表达我最终要做的事情和最终环境是如何的,然后我会一...
Uploadifive 批量文... Uploadifive 批量文件上传_uploadifive 多个上传按钮_asing1elife的...
C++入门语法基础 文章目录:1. 什么是C++2. 命名空间2.1 域的概念2.2 命名...
2023年全国DAMA-CDG... DAMA认证为数据管理专业人士提供职业目标晋升规划,彰显了职业发展里程碑及发展阶梯定义...
php实现助记词转TRX,ET... TRX助记词转地址网上都是Java,js或其他语言开发的示例,一个简单的...
【分割数据集操作集锦】毕设记录 1. 按要求将CSV文件转成json文件 有时候一些网络模型的源码会有data.json这样的文件里...
Postman接口测试之断言 如果你看文字部分还是不太理解的话,可以看看这个视频,详细介绍postma...
前端学习第三阶段-第4章 jQ... 4-1 jQuery介绍及常用API导读 01-jQuery入门导读 02-JavaScri...
4、linux初级——Linu... 目录 一、用CRT连接开发板 1、安装CRT调试工具 2、连接开发板 3、开机后ctrl+c...
Urban Radiance ... Urban Radiance Fields:城市辐射场 摘要:这项工作的目标是根据扫描...
天干地支(Java) 题目描述 古代中国使用天干地支来记录当前的年份。 天干一共有十个,分别为:...
SpringBoot雪花ID长... Long类型精度丢失 最近项目中使用雪花ID作为主键,雪花ID是19位Long类型数...
对JSP文件的理解 JSP是java程序。(JSP本质还是一个Servlet) JSP是&#...
【03173】2021年4月高... 一、单向填空题1、大量应用软件开发工具,开始于A、20世纪70年代B、20世纪 80年...
LeetCode5.最长回文子... 目录题目链接题目分析解题思路暴力中心向两边拓展搜索 题目链接 链接 题目分析 简单来说࿰...