Shell脚本测试总结
Shell脚本技巧

Shell脚本技巧1.test测试命令test命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试,其测试符和相应的功能分别如下:(1)数值测试:-eq:等于则为真-ne:不等于则为真-gt:大于则为真-ge:大于等于则为真-lt:小于则为真-le:小于等于则为真(2)字符串测试:=:等于则为真!=:不相等则为真-z 字符串:字符串长度伪则为真-n 字符串:字符串长度不伪则为真(3)文件测试:-e 文件名:如果文件存在则为真-r 文件名:如果文件存在且可读则为真-w 文件名:如果文件存在且可写则为真-x 文件名:如果文件存在且可执行则为真-s 文件名:如果文件存在且至少有一个字符则为真-d 文件名:如果文件存在且为目录则为真-f 文件名:如果文件存在且为普通文件则为真-c 文件名:如果文件存在且为字符型特殊文件则为真-b 文件名:如果文件存在且为块特殊文件则为真另外,Linux还提供了与(“!”)、或(“-o)、非(“-a”)三个逻辑操作符用于将测试条件连接起来,其优先级为:“!”最高,“-a”次之,“-o”最低。
同时,bash也能完成简单的算术运算,格式如下:$[expression]例如:var1=2var2=$[var1*10+1]则:var2的值为21。
2.if条件语句if [ -x /sbin/quotaon ]; thenecho "Turning on Quota for root filesystem"/sbin/quotaon /elif [ -x /sbin/quotaon ]; then/usr/bin/bashelseecho "ok"fi3.for 循环#!/bin/shWORD="a b c d e f g h i j l m n o p q r s t u v w x y z"for i in $WORD ; doecho $idone#!/bin/shFILES=`ls /txt/*.txt`for txt in $FILES ; dodoc=`echo $txt | sed "s/.txt/.doc/"`mv $txt $docdone4.while和until 循环#!/bin/shwhile [ -f /var/run/ppp0.pid ] ; dokillall pppddone#!/bin/shuntil [ -f /var/run/ppp0.pid ] ; dosleep 1doneShell还提供了true和false两条命令用于建立无限循环结构的需要,它们的返回状态分别是总为0或总为非05.case 条件选择#!/bin/shcase $1 instart | begin)echo "start something";;stop | end)echo "stop something";;*)echo "Ignorant";;esaccase表达式中也可以使用shell的通配符(“*”、“?”、“[ ]”)。
shell脚本生成随机数的若干方法总结

shell脚本⽣成随机数的若⼲⽅法总结shell脚本⽣成随机数的若⼲⽅法总结⽬录创建账户时我们需要配置初始随机密码,使⽤⼿机注册时会需要随机的验证码,再如俄罗斯⽅块需要随机出形状。
这都说明随机数据很重要,让我们来看看shell脚本中随机数的⽣成⽅法的⼀些案例1.使⽤字符串截取的⽅式⽣成随机密码#!/bin/bash#功能描述(Description):使⽤字串截取的⽅式⽣成随机密码.#定义变量:10个数字+52个字符.key="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"randpass(){if [ -z "$1" ];thenecho "randpass函数需要⼀个参数,⽤来指定提取的随机数个数."return 127fi#调⽤$1参数,循环提取任意个数据字符.#⽤随机数对62取余数,返回的结果为[0-61].pass=""for i in `seq $1`donum=$[RANDOM%${#key}]local tmp=${key:num:1}pass=${pass}${tmp}doneecho $pass}#randpass 8 取8个字符#randpass 16#echo $(randpass 6) 从key中随机取6个字符输出#创建临时测试账户,为账户配置随机密码,并将密码保存⾄/tmp/pass.log.useradd tomcatpasswd=$(randpass 6)echo $passwd | passwd --stdin tomcatecho $passwd > /tmp/pass.log2.使⽤命令⽣成随机数uuid的⽣成⽅法[root@localhost ~]# uuidgencc3652e3-7e54-498b-a4e3-6ff746f5cc73[root@localhost ~]# uuidgen6f5d5581-f4b4-4443-8cb3-37ad11b97d52[root@localhost ~]# uuidgenfc48a818-d323-48f1-b975-86e8f6d9046aopenssl命令来⽣成⽣成16进制的随机字符串[root@localhost ~]# openssl rand -hex 18e[root@localhost ~]# openssl rand -hex 2eeb6[root@localhost ~]# openssl rand -hex 32aefbb[root@localhost ~]# openssl rand -hex 478706e3a[root@localhost ~]# openssl rand -hex 50dfdd2bbbc[root@localhost ~]# openssl rand -hex 6e7a550493377⽣成含有特殊符号的随机字符串[root@localhost ~]# openssl rand -base64 1eQ==[root@localhost ~]# openssl rand -base64 6PdOc8SXT[root@localhost ~]# openssl rand -base64 10mHDkK/mEgITaVA==使⽤base64算法⽣成的随机数据,其最终的长度为(n/3)向上取整后在乘以4.如(1/3)=0.333333 ,向上取整为1,base64编码后长度为1×4=4位如(6/3)=2 ,向上取整为2,base64编码后长度为2×4=8位如(10/3)=3.333333 ,向上取整为4,base64编码后长度为4×4=16位[root@localhost ~]# date +%s #通过时间提取随机数字1588802225[root@localhost ~]# date +%s #1970-1-1到现在的秒数1588802231[root@localhost ~]# date +%s%N #1970-1-1到现在的纳秒数1588802237373838045#对明⽂加密⽣成随机字符串[root@localhost ~]# echo abc | openssl passwd -stdin89n8souuGpQS6[root@localhost ~]# echo 1234 | openssl passwd -stdinMhm/mQIxCm5nE#对密⽂⽤⼀段杂字⽣成随机字符串openssl passwd -1 -salt string //string⼀般为8位[root@localhost ~]# openssl passwd -1 -salt hellotomPassword:$1$hellotom$5j6sZNiOfuQiZuz421aFS.3.使⽤设备⽂件来⽣成在linux操作系统中默认提供了两个可以⽣成随机数的设备⽂件:/dev/random/dev/urandom。
Shell脚本中的异常监测技巧检测和处理脚本执行过程中的异常情况

Shell脚本中的异常监测技巧检测和处理脚本执行过程中的异常情况在Shell脚本编写过程中,监测和处理脚本执行过程中的异常情况是非常重要的。
异常情况可能包括命令执行失败、文件不存在、变量未定义等。
本文将介绍一些常见的异常监测技巧,帮助你更好地检测和处理这些异常情况,保证脚本的稳定性和可靠性。
1. 使用条件判断语句进行异常检测在Shell脚本中,我们可以使用条件判断语句(if语句)来检测异常情况。
例如,若我们希望检测一个命令是否执行成功,可以使用如下代码:```shellcommandif [ $? -ne 0 ]; thenecho "Command execution failed."# 可以加入相应的处理逻辑elseecho "Command executed successfully."# 可以继续脚本的执行fi```在上述代码中,`$?`是一个特殊的Shell变量,表示上一条命令的返回值。
返回值为0表示成功,非零值表示失败。
通过判断`$?`的值是否为0,我们可以判断命令是否执行成功,并根据需要作出相应的处理。
2. 使用条件判断语句检测文件是否存在在Shell脚本中,我们经常需要检测文件是否存在,以便根据文件是否存在来执行不同的操作。
可以使用如下代码进行文件的存在性检测:```shellif [ -e filename ]; thenecho "File exists."# 可以进行相应的处理逻辑elseecho "File does not exist."# 可以进行其他的操作fi```上述代码中的`-e`选项表示检测文件是否存在,若存在则返回真。
通过在条件判断语句中使用`-e`选项,我们可以判断文件的存在与否,从而根据需要作出相应的处理。
3. 使用条件判断语句检测变量是否未定义在Shell脚本中,有时候我们会忘记定义某个变量或者变量的取值为空,这可能导致脚本的执行出现异常。
Shell脚本性能测试之内存

Shell脚本性能测试之内存性能测试中,内存是⼀个不可或缺的⽅⾯。
⽐如说在跑 Monkey 的过程中,如何准确持续的获取到内存数据就显得尤为重要。
今天分享⼀个脚本,可以在给定时间内持续监控内存,最后输出成⼀份 CSV ⽂件,通过 Excel 的插⼊图表功能可以形成⼀副内存⾛势图。
脚本中最关键的两个步骤如下,其余看代码吧(注释很详细):1. 通过 adb 命令获取内存⽂件2. 通过 Python 脚本解析内存⽂件,取出其中的 "TOTAL" 值run.sh#!/usr/bin/env bash# Description: 获取内存TOTAL值# How to use: sh +x run.sh <package_name> <time># 新建输出⽂件夹function init_data() {if [[ ! -d ${OUTPUT} ]];thenmkdir -p ${OUTPUT}fitouch ${MEMINFO_FILE}}# 将⽇期追加⼊MEMINFO_FILE# 将内存信息追加⼊MEMINFO_FILEfunction dump_memory_info() {echo "TIME FLAG:" `date "+%Y-%m-%d %H:%M:%S"` >> ${1}adb shell dumpsys meminfo ${2} >> ${1}}# 每隔⼀分钟拉取⼀次内存信息function start_monitor() {for((i=1;i<=${1};i++));dodump_memory_info ${2} ${3}sleep 60done}# 处理"TOTAL:"格式的内存⽂件# 调⽤report脚本,传⼊参数MEMINFO_FILE# 将logs/csv/t_u.csv⽂件拷贝并重命名为MEMINFO_CSV_FILE# 删除"logs"⽂件夹,减少硬盘空间占⽤function report_with_colon() {sh +x report.sh ${1}cp -p logs/csv/t_u.csv ${2}rm -r logs}# 处理"TOTAL"格式的内存⽂件function report_without_colon() {sh +x report_no_colon.sh ${1}cp -p logs/csv/t_u.csv ${2}rm -r logs}# 调⽤report脚本,输出csv⽂件function report_memory_info() {TOTAL_TIME=$(cat ${1} | grep "TOTAL:" -c)if [[ ${TOTAL_TIME} != 0 ]]; thenreport_with_colon ${1} ${2}elsereport_without_colon ${1} ${2}fi}# 运⾏脚本时传⼊的第⼀个参数:包名PACKAGE_NAME=$1# 第⼆个参数:运⾏时间(分钟)TIME=$2# 绝对路径WORKSPACE=`pwd`# 输出⽂件夹OUTPUT=${WORKSPACE}/output_memory# 内存⽂件MEMINFO_FILE=${OUTPUT}/meminfo.txtMEMINFO_CSV_FILE=${OUTPUT}/meminfo.csv# 删除"output_memory",避免数据混淆if [[ -d "output_memory" ]]; thenrm -r output_memoryfi# 开始调⽤⽅法init_datastart_monitor ${TIME} ${MEMINFO_FILE} ${PACKAGE_NAME}report_memory_info ${MEMINFO_FILE} ${MEMINFO_CSV_FILE}report.sh#!/usr/bin/env bash# Description: 提取meminfo.txt中的TOTAl值并输出到CSV⽂件(适⽤于'TOTAL:'格式的内存⽂件)# 根据dumpsys meminfo后的⽂件中不同的标签,设定⽂件名# 因为标签诸如'.ttf mmap'等,中间有空格,不适合直接做⽂件名getMemFileName(){local tag=$1case ${tag} in"Native")fileName="native_meminfo.txt";;"Dalvik")fileName="dalvik_meminfo.txt";;"Cursor")fileName="cursor_meminfo.txt";;"Other dev")fileName="otherdev_meminfo.txt";;"Ashmem")fileName="ashmem_meminfo.txt";;".so mmap")fileName="so_meminfo.txt";;".jar mmap")fileName="jar_meminfo.txt";;".apk mmap")fileName="apk_meminfo.txt";;".ttf mmap")fileName="ttf_meminfo.txt";;".dex mmap")fileName="dex_meminfo.txt";;"Other mmap")fileName="other_meminfo.txt";;"Unknown")fileName="unknown_meminfo.txt";;"TOTAL:")fileName="total_meminfo.txt";;*);;esacecho ${fileName}}# 解析MonkeyTest完成后的meminfo.txt# 按列读取, 1, 2, 3, 4, 5列分别对应:Pss, SharedDirty, PrivateDirty, HeapSize, HeapFree splitMeminfo(){local fileName=$1# 删除VALUE字符串中以分隔符“.”匹配的右边字符,保留左边字符。
Linux系统性能测试脚本使用Shell脚本实现对Linux系统性能的压力测试和评估

Linux系统性能测试脚本使用Shell脚本实现对Linux系统性能的压力测试和评估在开发和运维过程中,评估和测试系统性能是至关重要的。
这有助于发现可能存在的瓶颈和问题,以便及时采取措施进行优化和改进。
Linux系统提供了丰富的工具和命令来评估和测试系统性能,而其中使用Shell脚本来实现性能测试可以更加方便和有效。
一、性能测试的目的和重要性性能测试是为了评估计算机系统或软件在特定条件下的运行性能。
它可用于评估系统的稳定性、可靠性、可扩展性、响应时间等指标。
通过性能测试,我们可以发现系统的瓶颈,优化资源的利用,提高系统的吞吐量和响应速度。
二、Shell脚本的优势Shell脚本是Linux系统中常用的脚本语言,具有以下优势:1. 简单易用:Shell脚本语法相对简单,易于理解和学习,而且可以直接在终端运行,不需要编译和链接过程。
2. 灵活性高:Shell脚本可以通过调用系统命令和工具来实现各种功能,包括性能测试。
并且可以结合其他脚本语言进行更复杂的操作。
3. 命令丰富:在Linux系统中,有大量的命令和工具可供使用,可以通过Shell脚本集成这些命令和工具来完成性能测试任务。
三、Shell脚本实现性能测试的步骤1. 设定测试环境:在开始性能测试之前,需要准备适当的环境,并安装必要的工具和软件。
例如,可以使用yum命令安装sysstat工具和其他性能测试工具。
2. 编写Shell脚本:Shell脚本负责执行性能测试的具体步骤和命令。
可以使用循环结构和计时器来模拟实际的压力测试情况。
3. 运行脚本:通过运行Shell脚本,可以执行性能测试并获取测试结果。
测试结果可以保存到文件中以便后续分析和比较。
4. 分析测试结果:根据测试结果,可以进行性能评估和分析,找出性能瓶颈,并提出相应的优化建议。
四、Shell脚本示例下面是一个简单的Shell脚本示例,用于实现Linux系统的CPU、内存和磁盘性能测试。
```bash#!/bin/bash# 测试CPU性能echo "CPU性能测试开始..."sysbench --test=cpu --cpu-max-prime=20000 runecho "CPU性能测试结束。
linux shell实验报告

linux shell实验报告《Linux Shell实验报告》摘要:本实验报告主要介绍了在Linux操作系统中使用Shell进行实验的过程和结果。
通过实验,我们深入了解了Shell的基本概念、常用命令和操作技巧,同时掌握了Shell脚本编写和执行的方法。
实验结果表明,Shell在Linux系统中具有重要的作用,能够提高工作效率和操作便利性。
一、实验目的本实验旨在通过实际操作,加深对Linux Shell的理解和掌握,探索Shell在Linux系统中的应用和作用。
二、实验内容1. Shell的基本概念在实验中,我们首先了解了Shell的基本概念,包括Shell是什么、其作用和特点等内容。
通过实际操作,我们发现Shell是一种命令行解释器,能够接收用户输入的命令并将其转化为操作系统能够理解的指令,从而实现对系统资源的管理和控制。
2. 常用Shell命令在实验中,我们学习了一些常用的Shell命令,如cd、ls、mkdir、rm等,以及它们的用法和功能。
通过实际操作,我们发现这些命令能够帮助我们在Linux 系统中进行文件和目录的管理,实现对系统资源的快速访问和操作。
3. Shell脚本编写和执行在实验中,我们还学习了如何编写和执行Shell脚本。
通过实际操作,我们发现Shell脚本能够帮助我们实现对一系列命令的批量执行,从而提高工作效率和操作便利性。
三、实验结果通过实验,我们深入了解了Shell的基本概念、常用命令和操作技巧,同时掌握了Shell脚本编写和执行的方法。
实验结果表明,Shell在Linux系统中具有重要的作用,能够提高工作效率和操作便利性。
四、结论本实验通过实际操作,加深了对Linux Shell的理解和掌握,探索了Shell在Linux系统中的应用和作用。
通过实验,我们发现Shell在Linux系统中具有重要的作用,能够提高工作效率和操作便利性,对于Linux系统的管理和维护具有重要的意义。
shell系统实验报告

shell系统实验报告《Shell系统实验报告》摘要:本实验通过对shell系统的学习和实践,对shell脚本编程进行了深入的研究和探讨。
通过实验,我们深入了解了shell系统的基本概念、语法和功能,并通过实际编程实践加深了对shell脚本的理解和掌握。
本实验报告将对实验过程、实验结果和实验感想进行详细的介绍和分析。
一、实验目的通过本次实验,我们的主要目的是深入了解shell系统的基本概念和语法,掌握shell脚本编程的基本方法和技巧,提高对Linux系统的操作和管理能力。
二、实验过程1. 学习shell系统的基本概念和语法规则;2. 编写简单的shell脚本,包括文件操作、流程控制、函数定义等;3. 运行和调试编写的shell脚本,检验脚本的正确性和可靠性;4. 分析实验结果,总结实验感想。
三、实验结果通过本次实验,我们深入了解了shell系统的基本概念和语法规则,掌握了shell 脚本编程的基本方法和技巧。
我们成功编写了一些简单的shell脚本,包括文件操作、流程控制、函数定义等,通过运行和调试这些脚本,我们验证了它们的正确性和可靠性。
实验结果表明,我们对shell系统有了更深入的认识和理解,对Linux系统的操作和管理能力得到了提高。
四、实验感想通过本次实验,我们对shell系统有了更深入的认识和理解,对Linux系统的操作和管理能力得到了提高。
我们深刻体会到了shell脚本编程的重要性和实用性,相信在今后的工作和学习中,我们会更加熟练地运用shell系统,提高工作效率和解决实际问题。
同时,我们也意识到了自己在shell系统方面的不足之处,今后需要进一步学习和实践,不断提高自己的技能水平。
综上所述,本次实验对我们的学习和成长都具有重要意义,我们将继续努力学习和提高自己,在shell系统和Linux系统方面取得更大的进步和成就。
Shell脚本中的调试技巧和工具

Shell脚本中的调试技巧和工具Shell脚本是一种用于自动化任务和批处理的脚本语言,广泛应用于Linux和Unix操作系统中。
为了确保脚本的正确性和稳定性,调试是非常重要的一环。
本文将介绍一些常用的Shell脚本调试技巧和工具,帮助开发者快速定位和解决问题。
一、使用echo语句输出调试信息在编写Shell脚本时,我们可以使用echo语句输出调试信息。
通过打印变量的值或者各个执行步骤的提示信息,可以帮助我们理解脚本的执行过程。
例如,我们可以使用以下语句在脚本某一关键点输出变量的值:```echo "变量x的值为:$x"```通过查看输出结果,我们可以确定变量x当前的取值是否正确,从而判断脚本的逻辑是否正确。
二、使用set -x命令启用调试模式在Shell脚本中,我们可以使用set -x命令来启用调试模式。
调试模式会输出每条命令的执行结果,帮助我们了解脚本的执行过程。
例如,我们可以在脚本的第一行添加以下语句:```set -x```这样,在执行脚本时,系统会输出每一条命令的执行结果,包括命令的具体语法和参数值。
通过查看这些输出,我们可以了解到脚本在某个位置发生了错误或逻辑问题。
需要注意的是,在调试完成后,一定要记得将set -x命令删除或注释掉,以避免调试信息泄露给不必要的人员。
三、使用set -e命令检测错误Shell脚本中的命令有时可能会执行失败,为了及时发现并处理这些错误,我们可以在脚本中使用set -e命令。
该命令会在遇到执行失败的命令时,立即退出脚本的执行。
例如,我们可以在脚本的第一行添加以下语句:```set -e```这样,在执行脚本时,如果某个命令执行失败,脚本会立即停止执行,并输出错误信息。
通过查看这些错误信息,我们可以快速定位问题所在,并进行相应的处理。
四、使用trap命令捕捉信号在Shell脚本中,我们可以使用trap命令捕捉信号。
当脚本接收到指定的信号时,可以执行指定的命令或函数。
linuxshell编程实验总结

linuxshell编程实验总结Linux Shell编程实验总结在Linux系统中,Shell编程是一种强大的工具,可以帮助用户进行自动化任务、脚本编写和系统管理。
通过学习和实践Shell编程,我深深地体会到了其在提高工作效率和简化任务流程方面的重要性。
在这篇文章中,我将总结我在Linux Shell编程实验中的经验和心得。
一、实验概述在这次Linux Shell编程实验中,我学习并应用了Shell脚本语言,掌握了基本的语法和命令,并通过实验来加深对Shell编程的理解和掌握。
实验的内容包括变量的定义和使用、条件语句的实现、循环结构的应用等。
二、变量的定义和使用在Shell编程中,变量的定义和使用是非常重要的一部分。
通过实验,我学会了如何使用“=”符号来给变量赋值,并可以在后续的命令中使用这个变量。
在实践中,我发现给变量加上$符号可以获取变量的值,并且可以在字符串中插入变量。
这在编写脚本时非常有用,可以将一些可变的部分定义为变量,提高程序的可读性和可维护性。
三、条件语句的实现条件语句在Shell编程中起到了重要的作用,可以根据不同的条件执行不同的命令。
通过实验,我掌握了Shell中常用的条件判断语句,如if语句和case语句。
在编写条件语句时,我注意到要使用适当的比较运算符(如“-eq”表示等于、“-ne”表示不等于等),并在语句块的结尾加上“fi”或“esac”来结束条件语句的定义。
四、循环结构的应用在实践中,我发现循环结构是Shell编程中非常重要的一部分,可以重复执行特定的任务。
通过实验,我掌握了两种常见的循环结构:for循环和while循环。
在编写循环结构时,我注意到要使用适当的循环控制语句,如“break”可以用于跳出循环,“continue”可以用于跳过当前循环中的剩余命令,继续下一次循环。
五、实验心得通过这次实验,我深刻认识到了Shell编程在自动化任务和脚本编写方面的重要性。
Shell编程既可以简化日常工作中的重复性任务,又可以提高工作效率和减少出错的可能性。
如何在Shell脚本中实现自动化测试

如何在Shell脚本中实现自动化测试在Shell脚本中实现自动化测试的方法和技巧Shell脚本是一种用于自动化任务的脚本语言,广泛应用于Linux和UNIX系统中。
自动化测试是软件开发中的重要环节,可以提高测试效率和质量。
本文将介绍如何在Shell脚本中实现自动化测试,从环境准备、测试用例编写、脚本执行和结果分析等方面进行论述。
一、环境准备在开始自动化测试之前,需要确保测试环境的搭建和准备工作完成。
以下是一些常见的环境准备步骤:1. 安装Shell解释器:一般情况下,Linux和UNIX系统已经默认安装了Shell解释器,如Bash。
如果需要使用其他Shell版本,可以根据需求自行安装。
2. 安装测试工具:根据实际需要,选择合适的测试工具进行安装,如JUnit、Selenium等。
二、测试用例编写编写有效的测试用例是自动化测试的关键。
以下是一些编写测试用例的建议:1. 明确测试目标:在编写测试用例之前,要明确测试的目标和要达到的预期结果。
这有助于编写准确的测试用例。
2. 使用合适的测试技术和方法:根据需求选择合适的测试技术和方法,如黑盒测试、白盒测试、单元测试、集成测试等。
3. 考虑边界条件和异常情况:在编写测试用例时,要考虑边界条件和异常情况,以确保测试的全面性和健壮性。
4. 使用自动化测试工具:为了实现自动化测试,可以使用Shell脚本结合自动化测试工具编写测试用例。
例如,使用Shell脚本调用JUnit执行Java单元测试。
三、脚本执行在编写完测试用例之后,可以开始编写Shell脚本来执行自动化测试。
以下是一些脚本执行的注意事项和技巧:1. 设置执行权限:在执行脚本之前,需要给脚本文件设置执行权限,使用命令chmod +x script.sh来赋予执行权限。
2. 添加脚本头部:在脚本的第一行添加脚本头部信息,如#!/bin/bash,用于指定脚本使用的Shell解释器。
3. 编写脚本逻辑:根据测试用例的执行顺序,编写脚本的逻辑部分。
linuxshell编程实验总结

Linux Shell 编程实验总结1.引言本文档总结了在学习Li nu xS he ll编程过程中的实验经验和心得体会。
通过对L in ux Sh el l编程实验的实施和总结,我们能够更好地理解S h el l脚本的运行机制,掌握Sh el l脚本的基本语法和常用命令,提高编写高效、精确的Sh e ll脚本的能力。
2.实验一:S hell 脚本基础2.1实验目的本实验旨在帮助学员熟悉Sh el l脚本的基本语法和常用命令,掌握脚本的编写与执行方法。
2.2实验内容在本实验中,我们学习了如何编写具有特定功能的Sh el l脚本,如输出H el lo Wo rl d、计算两个数之和、判断文件是否存在等。
2.3实验心得通过本实验的实施,我对Sh el l脚本的基本语法有了更深入的理解。
在编写脚本的过程中,我发现使用变量、条件判断和循环结构可以极大地提高脚本的灵活性和实用性。
同时,我也加深了对常用命令的认识和掌握,如e ch o、re ad、i f-e ls e、fo r循环等。
这些基本的知识将为后续的实验和项目实践打下坚实的基础。
3.实验二:文件和目录操作3.1实验目的本实验旨在帮助学员了解Li nu x文件系统的基本操作,掌握S he ll脚本中与文件和目录相关的命令。
3.2实验内容在本实验中,我们学习了如何创建、复制、重命名和删除文件、目录,以及如何查询文件和目录的属性信息等。
3.3实验心得通过本实验的实施,我对Li nu x文件系统有了更深入的了解。
我学会了如何使用S he ll脚本快速处理文件和目录,并且能够根据需求编写相应的脚本来操作文件。
例如,通过使用fi n d命令来查找文件,使用g r ep命令来搜索文件内容等。
这些技能在日常工作中非常有用,能够提高工作效率和准确性。
4.实验三:文本处理4.1实验目的本实验旨在帮助学员掌握Sh el l脚本中处理文本的常用命令和技巧,能够快速有效地处理常见的文本数据。
shell命令总结实验报告

shell命令总结实验报告shell 命令总结第⼀章实验思路1 运⾏环境VMware软件、CentOS 7、MobaXterm第⼆章实验⽬的1 掌握Linux的使⽤。
2 掌握shell常⽤命令。
3 掌握MobaXterm软件的使⽤第三章实验步骤Shell:多任务多⽤户系统3.1 终端物理终端:直接连接到的是键盘、⿏标 /dev/console虚拟终端:(/dev/tty)基于物理终端,以软件形式实现的登录⽅式,以ctrl+alt+Fn[1-6],centos 7模拟终端:(/dev/pts/)基于物理终端,以软件形式实现的登陆⽅式,通过ssh、telent远程登录的、(可以有很多个,⽆穷多个),在图形界⾯打开的命令⾏3.1.1 终端交互式接⼝GUI:图形界⾯,GNOME,KDE, XFCECLI: 命令⾏,shell3.2 shell 应⽤程序/bin/sh/bin/bash ⽐较常⽤shell,跟随⽤户启动的独⽴程序/usr/bin/sh/usr/bin/bash/bin/tcsh/bin/csh3.3 命令提⽰符#:管理员使⽤的命令提⽰符$: 普通⽤户使⽤的命令提⽰符3.4 命令3.4.1 shell 内嵌命令,执⾏效率⾼,常驻内存shell外部命令,根据需要执⾏which whereis 查找外部命令的位置3.4.2 帮助⽂档help,主要针对内嵌man(manual),主要针对外部命令3.4.3 主要命令1. echo $SHELL 查看当前使⽤的shell程序,当系统登录shell时默认使⽤的是/bin/bash2. exit 退出当前shell3. cat /etc/shells查看设备安装的所有shell程序4. pstree 查看进程树5. tty 查看登录⽅式 TTY查看登陆⽅式,tty1说明是在终端上登陆的。
pts说明是远程登陆的,0说明为从Window上登陆的。
6. type 查看是内部命令还是外部命令如下,查看cd 和ls命令7.enable -a 查看所有内嵌命令8. which 查看外部命令位置(以及帮助信息)9. whereis 查看外部命令位置10. man 查看外部命令使⽤说明,如man ls(ls 为外部命令)11. help 查看内部命令的使⽤说明,如help cd( cd 为内部命令),当⽤help查看ls这个外部命令时,是查询不出来的12. whatis 查看和更新数据库信息(帮助⽂档)1. ctrl+c 终⽌shell命令第四章问题解决没有注意到⼀些路径的设置,然后出现了些错误或者命令没执⾏成功。
shell常用测试命令

shell常⽤测试命令预定义变量: 预定义变量是由Bash程序预先定义好的⼀类特殊变量,⽤户只能使⽤预定义变量,⽽不能创建新的预定义变量,也不能直接为预定义变量赋值。
预定义⽐变量使⽤"$"符合和另⼀个符号组合表⽰。
$#:表⽰获取命令中位置参数的个数。
$*:表⽰获取所有位置参数的内容。
$?:表⽰前⼀条命令执⾏后的返回状态,返回值为0表⽰执⾏正确,任何⾮0值均表⽰出现异常。
$0:表⽰获取当前执⾏的脚本或程序的名称。
$n:表⽰获取执⾏shell脚本的第n个参数,n=1..9,如果⼤于9⽤⼤括号括起来${10}$$:获取当前shell的进程号(pid) ⽰例:echo "$$" >m.pid$!:执⾏上⼀个指令的PID,上⼀个后台运⾏进程的进程号$_:在此之前的命令(上⼀个命令)或脚本的最后⼀个参数预定义变量进阶:$* : 将命令⾏所有参数视为单个字符串,等同于“$1$2$3”$@ : 将命令⾏每个参数视为单独的字符串,等同于“$1” “$2” “$3”。
这是将参数传递给其他程序的最佳⽅法,因为他会保留所有内嵌在每个参数⾥的任何空⽩;⽂件测试:-d测试是否为⽬录(Directory)。
-s file ⽂件⼤⼩⾮0时为真。
-e测试⽬录或⽂件是否存在(Exist)。
-f测试是否为⽂件(File)。
-r测试当前⽤户是否有权限读(Read)。
-w测试当前⽤户是否有权限写(Write)。
-x测试是否有执⾏权限(Excute)。
附:-d参数使⽤⽰例:#[ -d /tmp/ ] #echo $? //查看前⼀条命令的返回值,0表⽰成⽴,tmp⽬录存在。
#[ -d /tmp/ ] && echo "YES" //如果tmp⽬录存在则在屏幕上打印YES。
整数值⽐较:-eq第1个数等于(Equal)第2个-ne第1个数不等于(Not Equal)第2个数-gt第1个数⼤于(Greater Than)第2个数-lt第1个数⼩于(Lesser Than)第2个数-le第1个数⼩于或等于(Lesser or Equal)第2个数-ge第1个数⼤于或等于(Greater or Equal)第2个数 附:-gt参数使⽤⽰例:#[ 6 -gt 5 ] && echo "Too many"在 [] 中使⽤的⽐较符在(()) , [[]]中使⽤的⽐较符-eq==-ne!=-gt>-ge>=-lt<-le<=字符串⽐较:=第1个字符串与第2个字符串相同。
Linux系统文件完整性检查脚本使用Shell脚本检查文件完整性并生成报告

Linux系统文件完整性检查脚本使用Shell脚本检查文件完整性并生成报告在Linux系统中,文件的完整性对于系统的安全和稳定性至关重要。
为了确保文件在运行过程中没有被篡改或损坏,可以使用Shell脚本来进行文件完整性检查,并生成相应的报告。
本文将介绍如何编写一个简单的Shell脚本来执行该任务。
脚本的主要功能包括以下几个方面:1. 获取指定目录下的所有文件及其相关信息;2. 计算每个文件的校验和(例如MD5);3. 将文件的路径、校验和和文件大小记录到报告中;4. 将报告保存到指定的输出文件。
首先,我们需要定义一些变量来存储相关信息。
使用`date`命令获取当前日期和时间,并将其保存到变量`timestamp`中。
再定义变量`report_file`来指定报告文件的路径和名称。
```#!/bin/bashtimestamp=$(date +"%Y%m%d%H%M%S")report_file="/path/to/report_${timestamp}.txt"```接下来,我们需要定义一个函数来计算文件的校验和。
这里以MD5为例,使用`md5sum`命令来计算文件的MD5值,并将结果保存到变量`checksum`中。
```calculate_checksum() {local file="$1"local checksum=$(md5sum "$file" | awk '{print $1}')echo "$checksum"}```然后,我们可以编写一个循环来遍历指定目录下的所有文件,并执行文件完整性检查。
使用`find`命令来查找指定目录下的所有文件,并将结果逐行传递给循环。
```directory="/path/to/directory"find "$directory" -type f | while read file; dochecksum=$(calculate_checksum "$file")size=$(du -b "$file" | awk '{print $1}')echo "$file,$checksum,$size" >> "$report_file"done```在每次循环中,我们调用`calculate_checksum`函数来计算文件的校验和,并使用`du`命令获取文件大小。
shell总结

shell总结1.shell的⼼得 学习shell的时候必须把重点放在流程控制上和shell⼯具上。
⼀定要⽤⼼记语法和命令。
2.介绍shell shell是⼀种解释型语⾔,程序不需要编译,程序在运⾏时由解释器翻译成机器语⾔,每执⾏⼀次都要翻译⼀次。
因此解释型语⾔效率低。
其实也是⼀种编译型语⾔。
程序在运⾏之前就被编译器编译过成机器语⾔,执⾏的时候执⾏编译过的结果就⾏了效率⾼。
shell的编译器是bash。
3.总结shell 3.1Linux提供的解析器有 [jinghang@hadoop101 ~]$ cat /etc/shells /bin/sh 是bash的⼀个快捷⽅式 /bin/bash bash是⼤多数Linux默认的shell,包含的功能⼏乎可以涵盖shell所有的功能 /sbin/nologin 表⽰⾮交互,不能登录操作系统 /bin/dash ⼩巧,⾼效,功能相⽐少⼀些 /bin/tcsh 具有C语⾔风格的⼀种shell,具有许多特性,但是也有⼀些缺陷 /bin/csh 是csh的增强版本,完全兼容csh 3.2变量 系统变量分为:$HOME、$PWD、$SHELL、$USER等 ⾃定义变量就是⾃⼰取名字。
特殊变量:$n $0该脚本名称,$1-$9第⼀到第九个参数⼗个以上需要⼤括号${10} 特殊变量:$# 获取参数的个数 特殊变量:$*、$@ $*:这个变量代表命令⾏中所有的参数,$*把所有的参数看成⼀个整体. $@:这个变量也代表命令⾏中所有的参数,不过$@把每个参数区分对待 特殊变量:$? $?:最后⼀次执⾏的命令的返回状态。
如果这个变量的值为0,证明上⼀个命令正确执⾏;如果这个变量的值为⾮0(具体是哪个数,由命令⾃⼰来决定),则证明上⼀个命令执⾏不正确了。
3.3运算符 “$((运算式))”或“$[运算式]” + , - , *, /, % 加,减,乘,除,取余 expr + , - , \*, /, % 加,减,乘,除,取余 3.4条件判断 = 字符串⽐较 -lt ⼩于(less than) -le ⼩于等于(less equal) -eq 等于(equal) -gt ⼤于(greater than) -ge ⼤于等于(greater equal) -ne 不等于(Not equal) 3.5流程控制 if[ 条件判断式 ]; then 程序 fi 或者 if[ 条件判断式 ]then 程序 elif[ 条件判断式 ]then 程序 else 程序 fi case $变量名 in "值1")如果变量的值等于值1,则执⾏程序1 ;;"值2")如果变量的值等于值2,则执⾏程序2 ;;…省略其他分⽀… *)如果变量的值都不是以上的值,则执⾏此程序 ;;esac for (( 初始值;循环控制条件;变量变化 )) do 程序 done while [ 条件判断式 ] do 程序 done 4.shell⼯具命令 4.1 cut cut的⼯作就是“剪”,具体的说就是在⽂件中负责剪切数据⽤的。
linux shell 实验报告

linux shell 实验报告Linux Shell 实验报告一、引言Linux Shell 是一种命令行解释器,它允许用户与操作系统进行交互。
作为一个开源的操作系统,Linux 提供了多种 Shell,如 Bash、Zsh、Ksh 等,每种 Shell 都有其特点和用途。
本实验旨在通过实际操作,深入了解 Linux Shell 的使用和功能。
二、实验目的1. 熟悉 Linux Shell 的基本概念和操作;2. 掌握 Shell 的常用命令和参数;3. 理解 Shell 脚本的编写和执行过程。
三、实验环境本次实验使用的实验环境为 Ubuntu 20.04 LTS 操作系统,使用默认的 Bash Shell。
四、实验内容1. Shell 基本操作在 Linux 系统中,打开终端即可进入 Shell 环境。
Shell 提供了丰富的命令用于文件操作、系统管理等。
以下是一些常用的 Shell 命令示例:- ls:列出当前目录下的文件和子目录;- cd:切换当前工作目录;- mkdir:创建新目录;- rm:删除文件或目录;- cp:复制文件或目录;- mv:移动文件或目录。
2. Shell 变量和环境变量Shell 变量用于存储数据,可以通过赋值和引用来操作变量。
环境变量是一种特殊的 Shell 变量,用于存储系统环境的信息。
以下是一些常用的变量和环境变量示例:- 变量赋值:name="John";- 变量引用:echo $name;- 环境变量:$HOME、$PATH、$USER。
3. Shell 脚本编写与执行Shell 脚本是一种批处理文件,由一系列命令组成,可以实现自动化操作。
以下是一个简单的 Shell 脚本示例:```shell#!/bin/bashname="John"echo "Hello, $name!"```将上述脚本保存为 `hello.sh`,通过 `chmod +x hello.sh` 命令给予执行权限,然后通过 `./hello.sh` 执行脚本。
shell编程实验总结

shell编程实验总结Shell编程实验总结Shell编程是一种在Linux系统中常用的脚本语言,它可以通过编写一些简单的脚本来完成一些复杂的任务。
在学习Shell编程的过程中,我通过实验掌握了一些基本的语法和技巧,现在将它们按照类别进行总结。
一、变量在Shell编程中,变量是非常重要的概念。
我们可以通过定义变量来存储一些数据,然后在程序中使用这些数据。
定义变量的语法如下:```variable_name=value```其中,`variable_name`是变量名,`value`是变量的值。
在使用变量时,需要在变量名前加上`$`符号。
例如:```name="Tom"echo "My name is $name"```这段代码会输出"My name is Tom"。
二、条件语句条件语句是Shell编程中常用的语句之一。
它可以根据条件的真假来执行不同的代码块。
条件语句的语法如下:```if conditionthencommand1command2...elsecommand3command4...fi```其中,`condition`是一个条件表达式,如果它的值为真,则执行`then`后面的代码块;否则执行`else`后面的代码块。
例如:```if [ $name = "Tom" ]thenecho "Hello, Tom!"elseecho "Who are you?"fi```这段代码会根据变量`name`的值输出不同的问候语。
三、循环语句循环语句是Shell编程中另一个常用的语句。
它可以重复执行一段代码块,直到满足某个条件为止。
Shell编程中有两种循环语句:`for`循环和`while`循环。
`for`循环的语法如下:```for variable in listdocommand1command2...done```其中,`variable`是一个变量名,`list`是一个列表,`command1`、`command2`等是要执行的命令。
Shell脚本调试技巧使用调试器和性能分析器深入探查问题

Shell脚本调试技巧使用调试器和性能分析器深入探查问题Shell脚本调试技巧:使用调试器和性能分析器深入探查问题Shell脚本是一种命令行解释器语言,广泛应用于自动化任务和系统管理。
然而,在开发和维护大型Shell脚本时,可能会遇到各种错误和性能问题。
为了提高调试效率和优化脚本性能,开发人员可以利用调试器和性能分析器进行深入探查问题。
本文将介绍如何使用调试器和性能分析器来帮助解决Shell脚本中的问题。
一、调试器的使用技巧调试器是一种用于跟踪和分析程序执行过程中错误的工具。
在Shell 脚本中,我们可以使用调试器来逐行执行脚本,并观察脚本的执行过程,以发现潜在的问题。
下面是几种常用的调试器使用技巧:1.1 设置断点在Shell脚本中使用调试器之前,我们需要在脚本中设置断点。
断点是代码中的一个标记,调试器会在执行到断点处停下来,允许我们逐行检查代码和变量的状态。
在Shell中,我们可以使用"set -x"命令在某一行代码之前设置断点。
例如:```set -xecho "Hello World"```在以上代码中,"set -x"命令将在执行"echo "Hello World""之前设置断点,当脚本执行到此处时,调试器会停下来并显示相关的执行信息。
1.2 单步调试一旦我们设置好了断点,我们可以使用调试器的单步调试功能逐行执行脚本。
在Shell中,我们可以使用"bash -x"命令来启动调试器。
例如:```bash -x script.sh```以上命令将以调试模式执行"script.sh"脚本,每当脚本执行到一个断点处时,调试器会暂停执行并等待用户输入。
1.3 查看变量的值在调试过程中,我们常常需要查看变量的值来判断程序的执行状态。
在Shell脚本中,我们可以使用"echo"命令打印变量的值。
shell实验报告

shell实验报告Shell实验报告一、实验目的本次实验旨在通过学习和实践Shell编程,掌握Shell脚本的基本语法和使用方法,提高对Linux系统的操作和管理能力。
二、实验环境本次实验使用的操作系统为Ubuntu 20.04 LTS,Shell编程语言为Bash。
三、实验内容1. Shell脚本的编写在实验开始前,我们首先需要了解Shell脚本的基本结构和语法。
Shell脚本是一种批处理脚本语言,它通过解释器执行,可以用来编写一系列的命令和程序,实现自动化的任务。
2. 变量和数据类型在Shell脚本中,我们可以定义变量来存储和操作数据。
变量可以是整数、字符串等不同的数据类型。
通过使用变量,我们可以方便地在脚本中引用和修改数据。
3. 控制流程控制流程是Shell脚本中非常重要的一部分,它可以用来控制程序的执行顺序和条件。
常见的控制流程语句包括if语句、for循环和while循环等。
通过合理使用控制流程,我们可以实现不同的逻辑和功能。
4. 输入输出Shell脚本可以通过读取用户的输入和输出结果来实现交互式的操作。
我们可以使用read命令来获取用户的输入,并通过echo命令来输出结果。
这样可以增加脚本的灵活性和可用性。
5. 函数和模块化函数是Shell脚本中的一种重要的代码组织方式,它可以将一段代码封装为一个独立的功能模块。
通过定义函数,我们可以提高代码的可读性和重用性。
6. 实际应用通过学习Shell脚本的基本语法和使用方法,我们可以将其应用于实际的系统管理和运维工作中。
比如,我们可以编写一个自动备份脚本,定期备份重要的文件和数据;或者编写一个自动化部署脚本,简化软件部署的流程。
四、实验心得通过本次实验,我对Shell脚本的编写和使用有了更深入的了解。
Shell脚本作为一种强大的工具,可以帮助我们简化繁琐的操作,提高工作效率。
同时,学习Shell脚本还可以培养我们的逻辑思维和编程能力。
在实验过程中,我发现Shell脚本的语法相对简单,上手较快。
Shell脚本test命令详解

Shell脚本test命令详解test命令在bash shell脚本中经常以中括号([])的形式出现,⽽且在脚本中使⽤字母来表⽰⽐符号表⽰更专业,出错率更低。
测试标志代表意义⽂件名、⽂件类型-e该⽂件名是否存在-f该⽂件名是否存在且为file-d该⽂件名是否存在且为⽬录-b该⽂件名是否存在且为⼀个block-c该⽂件名是否存在且为⼀个character device设备-S该⽂件名是否存在且为⼀个socket⽂件-p该⽂件名是否存在且为⼀个FIFO(pipe)⽂件-L该⽂件名是否存在且为⼀个连接⽂件⽂件权限检测-r检测⽂件名是否存在且具有“可读”权限-w检测⽂件名是否存在且具有“可写”权限-x检测⽂件名是否存在且具有“可执⾏”权限-u检测⽂件名是否存在且具有“SUID”权限-g检测⽂件名是否存在且具有“SGID”权限-k检测⽂件名是否存在且具有“Sticky bit”权限-s检测⽂件名是否存在且为“⾮空⽩⽂件”两个⽂件的⽐较-nt(newer than)判断file1是否⽐file2新-ot(older than)判断file是否⽐file2旧-ef判断file1与file2是否为同⼀个⽂件,可⽤在判断hard link上数字之间的判定-eq equal-ne not equal-gt greater than-lt less than-ge greater than or equal-le less than or equal判断字符串的数据test -z string判断字符串是否为0,若为空返回truetest -n string判断字符串是否为0,若为空返回falsetest str1 = str2判断str1是否等于str2,若相等,返回truetest str1 != str2判断str1是否等于str2,若相等,返回false多重条件的判断-a两个条件同时成⽴,eg:test -r file a test -x file,同时成⽴返回true-o任何⼀个条件成⽴,eg:test -r file o test -x file,同时成⽴返回true!反向状态,如test!-x file,当file不具有x时,返回true。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2. 我们应该如何入手
首先,代码走查结合动态单步跟踪以及观察日志与文件输出,网络、CPU状态。
然后,撰写测试桩与驱动,白盒测试保证代码逻辑中循环和分支都能够走到,黑盒测试保证函数和功能脚本接口正确,输入输出符合设计预期。
对于异常处理,特别是变量的检查需要特别关注,变量在使用前都需要进行检查,是否为空?或者为0?对于文件名和路径必须检查,确认文件是否存在,路径是否可达之后再进行后续操作。
. 回到正在执行的代码行
w 列出正在执行的代码行前后的代码
/pat/ 向后搜索pat
?pat?向前搜索pat
2.Debug控制类:
h 帮助
help 命令 得到命令的具体信息
q 退出bashdb
x 算数表达式 计算算数表达式的值,并显示出来
!!空格Shell命令 参数 执行shell命令
【解决】使用 && 连接 cd失败将不会继续执行后面的命令
问题二:
【脚本内容】
for data in ${datalist{@}}
do
runRemoteCmd ${host} "cd ${data_path}.new && [[ -f ${data_flag} ]]" || suc=0 && break
【解决】避免使用i,j,k等常见的循环控制变量,使用自定义的变量名,如retry_count等
在shell函数中定义的变量加上local关键字
5) 命令连接
问题一:
【脚本内容】:
cd to_del; rm -rf *
【问题】:如果cd 目录失败,rm -rf * 会错误地删除当前目录下的所有文件
“-c”选项使shell解释器从一个字符串中而不是从一个文件中读取并执行shell命令。当需要临时测试一小段脚本的执行结果时,可以使用这个选项,如下所示:
sh -c 'a=1;b=2;let c=$a+$b;echo "c=$c"'
"-x"选项可用来跟踪脚本的执行,是调试shell脚本的强有力工具。“-x”选项使shell在执行脚本的过程中把它实际执行的每一个命令行显示出来,并且在行首显示一个"+"号。 "+"号后面显示的是经过了变量替换之后的命令行的内容,有助于分析实际执行的是什么命令。 “-x”选项使用起来简单方便,可以轻松对付大多数的shell调试任务,应把其当作首选的调试手段。
-c "string" 从strings中读取命令
“-n”可用于测试shell脚本是否存在语法错误,但不会实际执行命令。在shell脚本编写完成之后,实际执行之前,首先使用“-n”选项来测试脚本是否存在语法错误是一个很好的习惯。因为某些shell脚本在执行时会对系统环境产生影响,比如生成或移动文件等,如果在实际执行才发现语法错误,您不得不手工做一些系统环境的恢复工作才能继续测试这个脚本。
【问题】:上述代码将远程执行命令行的输出结果导入到一个以pid命名的临时文件中,在脚本关闭的时候没有清除,每一次执行将创建一个新文件,很可能导致文件泄露问题。
【解决】注意清理脚本生成的临时文件
7) ssh 远程执行后台命令不靠谱
【脚本内容】:
ssh hostname "cat bin &“
3.单元测试2:对于单个功能脚本sh -x XXX.sh 跟踪脚本执行情况
4.集成测试1:对于所有脚本使用sh -x XXX.sh 跟踪脚本执行情况
5.集成测试2:模拟脚本生产环境,周期性连续多次执行全部功能脚本,监控脚本性能以及日志、临时文件等状态。
6. 脚本测试中遇到的问题和解决方案
1) 判断一个数组是否为空:
[work@ bin]$ ssh localhost "cat bin"
cat: bin: Is a directory
[work@ bin]$ echo $?
1
8) 变量使用前使用unset清理
【脚本内容】:一般是针对脚本的配置文件
cond n expr 条件断点
5. 脚本测试的基本流程
1.静态代码检查
2.单元测试1:针对每个功能函数撰写驱动和桩,验证所有分支
? 确认每个配置项以及设计的文件目录是否在使用前进行检查
? 确认所有的变量没有向外传播的危险
? 确认所产出的临时文件没有泄露,脚本自己会负责处理掉临时文件
2) $BASH_SOURCE
shell脚本源文件名,与FUNCNAME相对应
3) $BASH_LINENO
代表shell脚本的当前行号,类似于C语言中的内置宏__LINE__,与FUNCNAME相关联
BASH_LINENO[$i] 指示的是 FUNCNAME[$i + 1]被调用的位置
【问题】: .$i] 的“]”前面没有空格,造成语法错误
【sh -x 执行】:./test.sh: line 3: [: missing `]
【原因】: If语句的条件判断“[ ]”,“[”之后和“]”之前必须有空格
【解决】加上空格
3) 字符串判断
【脚本内容】:
if [ "$1" = "continue" ] then
参数:
-f 仅删除函数。
-v 仅删除变量。
例如:unset ps_retras
ps_retras[0]="work@"
ps_retras[1]=“work@“
7. shell 内置变量
1) $FUNCNAME
函数的名字,类似于C语言中的内置宏__func__,但宏__func__ 只能代表当前所在的函数名,而$FUNCNAME的功能更强大,它是一个数组变量,其中包含了整个调用链上所有的函数的名字,故变量${FUNCNAME [0]}代表shell脚本当前正在执行的函数的名字,而变量${FUNCNAME[1]}则代表调用函数${FUNCNAME[0]}的函数的名字,依此类推。
使用bashdb进行debug的常用命令(cont.)
控制脚本执行类:
n 执行下一条语句,遇到函数,不进入函数里面执行,将函数当作黑盒
s n 单步执行n次,遇到函数进入函数里面
b 行号n 在行号n处设置断点
del 行号n 撤销行号n处的断点
c 行号n 一直执行到行号n处
R 重新启动
Finish 执行到程序最后
3) 搭建环境
搭建环境需要了解脚本的运行场景,运行频率,环境依赖以及与其配合的上下文脚本及程序:
脚本执行时所处的目录和配置文件
对应的产品模块功能
数据的周期性更新
server间的ssh认证
网络通信端口检查
脚本中的使用的工具
脚本硬件要求
比如说:脚本在什么目录下执行,每天几点钟执行,执行的时候需要什么数据以及工具提前准备好,等等。
2) 代码走查
全面、深入、细致地关注脚本分支、循环逻辑正确性。
例如:retrbs重启脚本,在重启PS平台所有retrbs之后,需要清理PS平台retras cache,新增的启动方式升级分成两种启动方式,normal与continue模式,实际在codereview时发现normal方式重启完成后清理cache,continue方式重启完成后直接退出,这肯定是有问题的,因为按正常逻辑来说,不管那种启动方式,在重启完成之后都需要清理cache。
另外,需要考虑所依赖的其他功能脚本以及二进制工具,这些功能性单元应该如何使用,调用后的返回会有哪些情况,对于正常和异常结果,脚本是否能够捕捉到并且作出正确的判断。
3. 静态测试 && 动态测试
1) 新旧版本代码对比
可以基于icafe平台的codereview功能查看新旧版本的diff代码行,对比升级点,及时与RD沟通确认,避免遗漏,保证测试的全面性。代码对比的方式可能局限性比较大,适用于两个连续版本间代码结构无大的改动的情况,很多情况下,新版本的脚本会与之前的版本完全不同,Shell脚本与C语言模块有一个很大的区别就是,IM 模块C 代码的前后版本实现的承接关系很明显,但是Shell脚本不一定,可能后来的RD会将之前版本的脚本完全推翻。代码结构完全不同,因此在这种情况下,我们应该直接进入代码走查环节。
4. 如何调试Shell脚本
1) 检查语法错误:
一般来说我们可以通过修改shell脚本的源代码,令其输出相关的调试信息来定位错误,那有没有不修改源代码来调试shell脚本的方法呢?答案就是使用shell的执行选,下面是一些常用选项的用法:
-n 只读取shell脚本,但不实际执行
-x 进入跟踪方式,显示所执行的每一条命令
echo “succ”
fi
【问题】:$1为空,打印“succ”
【sh -x 执行】:succ
【原因】: $1为空会造成语法错误,返回0,继续执行if代码块中的逻辑,导致判断错误
【解决】修改成 if [ "a$1" = "acontinue" ]
4) 变量传播
【脚本内容】:
func(){
【脚本内容】:
if [ -z ${pg_readyDatalist[@]} ]
then
…………
fi
【问题】:不可如此判断,超过一个元素时,语法错误
【sh -x 执行】:
+ '[' -z model gtrindex ']'