毕设网站建设,孝感市门户网站,推广普通话活动总结,wordpress 主机安装一、函数递归
1.1 函数简介 样式1#xff1a;函数间调用 - 函数体内部调用其他的函数名 样式2#xff1a;文件间调用 - 函数体内部调用另外一个文件的函数名 - 需要额外做一步文件source的加载动作 注意#xff1a;我们将专门提供函数的文件称为 -- 函数库…一、函数递归
1.1 函数简介 样式1函数间调用 - 函数体内部调用其他的函数名 样式2文件间调用 - 函数体内部调用另外一个文件的函数名 - 需要额外做一步文件source的加载动作 注意我们将专门提供函数的文件称为 -- 函数库 样式3函数自调用 - 函数体内部调用自己的函数名将复杂的逻辑简单化 1.2 简单实践 需求: 实现数学阶乘的实践 示例5的阶乘 完整格式5! 1 * 2 * 3 * 4 * 5 120 简写格式5! 5 * (1 * 2 * 3 * 4) 5 * 4! 公式: x! x * (x-1)! 查看脚本内容
[rootlocalhost ~]# vim a.sh
#!/bin/bash
# 功能函数自调用实践# 定制功能函数框架
self_func(){# 接收一个参数num$1if [ ${num} -eq 1 ];thenecho 1else# 定制一个临时本地变量获取递减后的值local temp$[ ${num} - 1 ]# 使用函数自调用方式获取内容local result$(self_func $temp)# 格式化输出信息echo $[ $result * ${num} ]fi
}# 检测逻辑效果
while true
doread -p 请输入一个您要查询的阶乘 valueresult$(self_func ${value})echo ${value}的阶乘是: ${result}
done 1.3 案例实践
实践1-遍历制定目录下的所有文件
[rootlocalhost ~]# vim a.sh
#!/bin/bash
# 功能扫描目录下所有文件
# 版本v0.1
# 作者书记
# 联系# 定制功能函数框架
# 定制目录扫描功能函数
scan_dir() {# 定制临时局部功能变量# cur_dir 当前目录 workdir 工作目录local cur_dir workdir# 接收要检查的目录进入到目录中workdir$1cd ${workdir}# 对工作目录进行简单判断根目录没有父目录if [ ${workdir} / ]thencur_direlsecur_dir$(pwd)fi# 查看当前目录下的文件列表for item in $(ls ${cur_dir})do# 如果文件是目录则继续查看目录下文件if test -d ${item};thencd ${item}scan_dir ${cur_dir}/${item}cd ..# 如果文件是普通文件则输出信息即可elseecho ${cur_dir}/${item}fidone
}# 检测逻辑效果
while true
doread -p 请输入一个您要查询的目录 valueif [ -d ${value} ]thenscan_dir ${value}elseecho 您输入的不是目录请重新输入!fi
done 二、脚本自动化
2.1 简介
信号值描述信号值描述1SIGHUP挂起进程15SIGTERM优雅的终止进程2SIGINT终止进程17SIGSTOP无条件停止进程不终止进程3SIGQUIT停止进程18SIGTSTP停止或暂停进程不终止进程9SIGKILL无条件终止进程19SIGCONT继续运行停止的进程 默认情况下bash shell会忽略收到的任何SIGQUIT(3)和SIGTERM(15)信号正因为这样交互式shell才不会被意外终止。但是bash shell会处理收到的SIGHUP(1)和SIGINT(2)信号。 如果bash shell收到SIGHUP信号它会退出。但在退出之前它会将信号传给shell启动的所有进程比如shell脚本。通过SIGINT信号可以中断shellLinux内核停止将CPU的处理时间分配给shell当这种情况发生时shell会将SIGINT信号传给shell启动的所有进程。 生成信号
终止进程ctrlc,
暂停进程ctrlz,停止的进程继续保留在内存中并能从停止的位置继续运行
恢复进程:jobs查看运行任务fg num 重新执行
杀死进程:kill -9 pid 2.2 信号捕捉
简介 shell编程提供了一种方式让我们可以随意的控制脚本的运行状态这就需要涉及到信号的捕获操作。在shell编程中我们可以借助于 trap命令实现指定shell脚本要watch哪些linux信号并从shell中拦截。如果脚本收到了trap命令中列出的信号它会阻止它被shell处理而在本地处理。 trap命令格式
命令格式trap commands signals命令示例# 收到指定信号后执行自定义指令而不会执行原操作trap 触发指令 信号# 忽略信号的操作trap 信号# 恢复原信号的操作trap - 信号# 列出自定义信号操作trap -p# 当脚本退出时执行finish函数trap finish EXIT 简单实践
实践1-捕获终止信号
查看脚本内容
[rootlocalhost ~]# vim a.sh
#!/bin/bash
# 功能脚本信号捕捉# 捕获关闭信号
trap echo 你敢关我就不关气死你 SIGINT SIGTERM
trap echo 走了不送 EXIT# 检测逻辑效果
while true
doread -p 请输入一个数据 valueecho 您输入的数据是: ${value}
done
效果
脚本执行效果
[rootlocalhost ~]# /bin/bash a.sh
请输入一个数据4
您输入的数据是: 4
请输入一个数据^Csignal_trap_test1.sh:行1: 你敢关我就不关气死你: 未找到命令您输入的数据是:
请输入一个数据^Z
[1] 已停止 /bin/bash signal_trap_test1.sh
[rootlocalhost ~]#
[rootlocalhost ~]# jobs
[1] 已停止 /bin/bash signal_trap_test1.sh
[rootlocalhost ~]# fg 1
/bin/bash signal_trap_test1.sh您输入的数据是:
请输入一个数据3
您输入的数据是: 3
另开一个终端直接kill进程
[rootlocalhost ~]# ps aux | grep sign
root 39142 0.0 0.0 113288 1460 pts/0 S 17:43 0:00 /bin/bash signal_trap_test1.sh
[rootlocalhost ~]# kill -9 39142回到之前的终端查看效果
[rootlocalhost ~]# fg 1
/bin/bash signal_trap_test1.sh您输入的数据是:
请输入一个数据3
您输入的数据是: 3
请输入一个数据已杀死 实践2-捕获正常退出
查看脚本内容
[rootlocalhost ~]# vim a.sh
#!/bin/bash
# 功能脚本信号捕捉# 捕获关闭信号
trap echo 走了.不送 EXITvalue0
# 检测逻辑效果
while true
doread -p 请输入一个数据 valueif [ ${value} 9 ]thenexitelseecho 您输入的数据是: ${value}fi
done 实践3-移除捕获
查看脚本内容
[rootlocalhost ~]# vim a.sh
#!/bin/bash
# 功能移除脚本信号捕捉# 捕获关闭信号
trap echo 走了.不送 EXITi1
# 检测逻辑效果
while [ $i -le 3 ]
doread -p 请输入一个数据 valueif [ ${value} 9 ]thenexitelseecho 您输入的数据是: ${value}filet i1
done# 移除捕获信号
trap - EXIT
echo 移除了捕获信号 三、expect基础
3.1 基础知识
场景需求 在日常工作中经常会遇到各种重复性的手工交互操作虽然没有什么技术含量但是相当的重要。在实际的工作场景中这种重复性的手工操作动作非常的繁多但是对于量大的工作来说效率就非常低效了。所以我们就需要有一种工具能够简化我们重复的手工操作。 expect简介 expect是一个免费的编程工具由DonLibes制作作为Tcl脚本语言的一个扩展,它可以根据程序的提示模拟标准输入提供给程序从而实现自动的交互式任务而无需人为干预,可以用作Unix系统中进行应用程序的自动化控制和测试的软件工具。 说白了expect就是一套用来实现自动交互功能的软件。它主要应用于执行命令和程序时系统以交互形式要求输入指定字符串实现交互通信。在使用的过程中主要是以脚本文件的样式来存在 官方网站 https://www.nist.gov/services-resources/software/expect 工具手册 man expect 软件部署
安装软件
[rootlocalhost ~]# yum install expect -y进入专用的命令交互界面
[rootlocalhost ~]# expect
expect1.1 ls
anaconda-ks.cfg
expect1.2 exit
命令帮助-c: 执行脚本前先执行的命令可多次使用多个命令之间使用隔开-d: debug模式可以在运行时输出一些诊断信息与在脚本开始处使用exp_internal 1相似。-D: 启用交换调式器,可设一整数参数。-f: 从文件读取命令仅用于使用#!时。如果文件名为-则从stdin读取(使用./-从文件名为-的文件读取)。-i: 交互式输入命令使用exit或EOF退出输入状态。--: 标示选项结束(如果你需要传递与expect选项相似的参数给脚本时)可放到#!行:#!/usr/bin/expect --。-v: 显示expect版本信息 3.2 简单实践 在进行expect脚本编写的时候我们需要记住 -- expect 用的不是我们普通的shell或者python语法它使用的是Tcl语法。 Tcl 全称是 Tool command Language。它是一个基于字符串的命令语言基础结构和语法非常简单易于学习和掌握。Tcl 语言是一个解释性语言所谓解释性是指不象其他高级语言需要通过编译和联结它象其他 shell 语言一样直接对每条语句顺次解释执行。 Tcl 数据类型简单。对 Tcl 来说它要处理的数据只有一种——字符串。Tcl 将变量值以字符串的形式进行存储不关心它的实际使用类型。 输出语法 输出tcl使用”puts关键字来作为输出语句 样式puts -nonewline string 属性解析 如果string中间有特殊字符可以使用 {} 或者 将其作为一个小组共同输出 -nonewline 代表输出结果的时候不输出换行符 put 和 puts 都可以在命令行使用但是脚本中最好用puts 脚本基础 1 文件名后缀 .expect 作为标识符 2 文件首行要指定命令的执行解释器 #!/usr/bin/expect 3 脚本文件的执行 expect 脚本名 脚本内容示例
[rootlocalhost ~]# vim a.expect
#!/usr/bin/expect
# 设定一个环境变量
set var nihao
# 输出环境变量
puts $var脚本执行效果
[rootlocalhost ~]# expect expect_test.expect
nihao 3.3 语法实践
赋值语法 赋值tcl 使用“set”关键字来定义参数不必指定变量值的类型因为变量值的类型仅一种——字符串 样式set varName [value] 注意 变量名是由 数字、下划线、字符组成数字不能开头大小写敏感。 expect1.7 set a Hello # 设定一个变量名a
Hello
expect1.8 put $a # 使用$ 符号获取变量名的存储值
Hello
expect1.9 put $a # 使用 方式打印变量的值
Hello
expect1.10 put {$a} # {} 有别于 的特点在于原字符输出
$a
expect1.11 set b $a # 变量的传递
Hello
expect1.12 puts $b
Hello 替换语法
替换(解析)- $符号可以实现引用替换用于引用变量名代替的参数值但是TCL对嵌套的”$”不于理睬- [] 方括号“[]”完成命令替换。用“[]”将一条命令括起来命令执行完成后返回结果
expect1.20 set b [set a 5] # 相当于 set b $a,传递赋值
5
expect1.21 puts $b
5
expect1.22 set c [expr 5 * 10 ] # expr是执行系统命令将计算结果交给c
50
expect1.24 puts $c
50
注意事项
变量的设定
expect1.13 set var value # 设定一个普通变量名
value
expect1.14 puts $var # 获取变量名的值
value不支持嵌套$
expect1.15 set var1 $$value # TCL不支持嵌套的$
cant read value: no such variablewhile executing
set var1 $$value
expect1.16 set var1 $$var # 由于$var 已经是变量所以前面的$就无效了
$value
expect1.17 puts $var1
$value原字符输出
expect1.18 set var2 {$var1} # {} 代表原字符输出
$var1
expect1.19 puts $var2
$var1 脚本实践
内置变量 对于tcl来说它内部包含了大量的内置变量可以让我们实现快速的功能操作。 常见的内置变量有 argc 指命令行参数的个数。 argv 指包含命令行参数的列表。 argv0 是指被解释的文件或由调用脚本的名称的文件名。 env 用于表示是系统环境变量的内容普通变量我们还是使用$即可 tcl_version 返回Tcl解释器的最新版本注意不是expect的版本号 内置参数实践
[rootlocalhost ~]# cat expect_test1.expect
#!/usr/bin/expect
# 查看当前文件传递的参数数量
puts 当前文件传递的参数数量: $argc# 查看当前文件传递的参数
puts 当前文件传递的参数: $argv# 查看当前文件名称
puts 当前文件名称: $argv0# 获取变量值
puts 当前系统变量PATH的值是: $env(PATH)
set key value
puts 普通变量 key 的值是: $key# 查看版本信息
puts 当前tcl版本信息: $tcl_version
脚本执行效果
[rootlocalhost ~]# expect expect_test1.expect
当前文件传递的参数数量: 0
当前文件传递的参数:
当前文件名称: expect_test1.expect
当前系统变量PATH的值是: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
普通变量 key 的值是: value
当前tcl版本信息: 8.5 3.4 交互基础
脚本基础
命令解释器
命令解释器
#!/usr/bin/expect
#!/usr/bin/expect -f 从文件中读取自动化命令
#!/usr/bin/expect - 如果文件名为 - 那么从终端输入中读取
#!/usr/bin/expect -i 交互式输入命令
#!/usr/bin/expect -- 脚本传递的选项参数和expect选项相似的参数给脚本
注意#!是对脚本的解释器程序路径脚本的内容是由解释器解释的注释信息
# 被注释的信息
常见符号
{ }作用1保留所有字符原有的意思而不做解释类似于shell中的单引号样式set var {nihao hehehe}作用2代码块儿但是两个 {} 边界必须在一起。正确样式if {代码块1 } {代码块2}错误示例if {$count 0}{break;}注意无论什么时候{}边界符号与其他内容都最好有空格隔开尤其是边界外的内容
[]作用执行命令类似shell中的 (反引号)或者 $()样式set count [expr $count - 1 ]注意在expect 中没有小括号的概念和应用
常用命令
set 设定环境变量格式set 变量名 变量值样式set host 192.168.8.12spawn 启动新的进程模拟手工在命令行启动服务格式spawn 手工执行命令样式spawn ssh python$hostexpect 接收一个新进程的反馈信息我们根据进程的反馈再发送对应的交互命令格式expect 交互界面用户输入处的关键字样式expect *password*send 接收一个字符串参数并将该参数发送到新进程。格式send 用户输入的信息 样式send $password\rinteract 退出自动化交互界面进入用户交互状态如果需要用户交互的话这条命令必须在最后一行格式interact样式interact其他命令exit 退出expect脚本expect eof expect执行内容的结束标识符退出当前脚本与interact只能存在一个puts 输出变量的信息相当于linux命令中的echowait 退出程序后等待时间回收僵尸进程disconnect 断开一个进程连接但让它在后台继续运行。exp_continue expect获取期望后还会有另外的期望那么我们就把多个期望连续执行 简单实践
实践1-简单的登录交互脚本
查看脚本内容
[rootlocalhost ~]# cat login_test.expect
#!/usr/bin/expect# 1 设定环境变量
set username python# 2 发起远程登录请求
spawn ssh $username192.168.66.146# 3 识别用户输入的位置关键字
expect yes/no# 4 发送正确的信息
send yes\r# 5 识别密码关键字并传递密码信息
send \r
expect password:
send 123456\r# 6 切换回用户交互界面
interact注意:由于password前面会涉及到一次Enter操作所以在password匹配前输入一次 \r 清理历史记录 [rootlocalhost ~]# rm -f ~/.ssh/known_hosts 执行脚本内容 [rootlocalhost ~]# expect login_test.expect spawn ssh python10.0.0.12 The authenticity of host 10.0.0.12 (10.0.0.12) cant be established. ECDSA key fingerprint is SHA256:XUJsgk4cTORxdcswxIKBGFgrrqFQzpHmKnRRV6ABMk4. ECDSA key fingerprint is MD5:71:74:46:50:3f:40:4e:af:ad:d3:0c:de:2c:fc:30:c0. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added 10.0.0.12 (ECDSA) to the list of known hosts. python10.0.0.12s password: [pythonlocalhost ~]$ id uid1000(python) gid1000(python) 组1000(python) 实践2-脚本结合 expect 除了使用专用的expect脚本来实现特定功能之外它还可以与其他脚本嵌套在一起进行使用。最常用的结合方式就是 shell结合。 在于shell结合使用的时候无非就是将expect的执行命令使用 -EOF 。。。 EOF 包装在一起即可。 样式 /usr/bin/expect-EOF spawn ... ... expect eof EOF 注意 由于expect在shell中是作为一个子部分而存在的所以一般情况下expect结束的时候使用eof命令表示expect的内容到此结束 查看脚本内容
[rootlocalhost ~]# cat expect_auto_login.sh
#!/bin/bash
# 功能shell自动登录测试
# 版本v0.1
# 作者书记
# 联系# 定制普通变量
host$1
username$2
password$3/usr/bin/expect -EOF
# 发出连接进程
spawn ssh ${username}${host}# - 正常登陆
expect {yes/no* { send yes\n; exp_continue }password: {send ${password}\n;}
}
puts 测试完毕!!!
expect eof
EOF 脚本测试效果 [rootlocalhost ~]# /bin/bash expect_auto_login.sh 10.0.0.12 python 123456 spawn ssh python10.0.0.12 python10.0.0.12s password: 测试完毕!!! [pythonlocalhost ~]$ exit [rootlocalhost ~]#