#!/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 程序。
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
解决方法
当前目录下输入命令bash [filename]
其他目录下,输入相对路径执行bash scripts/[filename]
或使用绝对路径
有可执行权限时文件名变为绿色
.
指当前工作目录注意:必须具有可执行权限,即
+x
,否则报错
查看文件权限的方法
source
和 .
是bash shell的内部命令
前两种方式是在当前shell打开一个子shell脚本来执行脚本内容,当脚本内容结束则关闭子shell,回到父shell中。
第三种方式可以使脚本内容在当前shell里执行,而无需打开子shell。这也是每次修改完/etc/profile
后,需要source
的原因。
两者的区别在于环境变量的继承关系,如在子shell中设置的当前变量,父shell是不可见的。
上一篇:栈的定义及基本操作实现(顺序栈)
下一篇:常微分方程-差分方程