shell脚本 免交互和字符处理

一、Here Document

1. Here Document定义

使用I/O重定向的方式将命令列表提供给交互式程序

语法格式:
命令<<   标记

....
输入内容
......

标记

2. Here Document注意事项

  1. 标记可以使用任意的合法字符(通用的字符是EOF)

  2. 结尾的标记一定要顶格写,前面不能有任何字符(包括空格)

  3. 结尾的标记后面也不能有任何字符(包括空格)

  4. 开头标记前后空格会被省略掉

3. Here Document操作

3.1 统计行数

3.2 read命令

3.3 passwd命令

4. Here Document变量设定

Here Document 也支持使用变量,如果标记之间有变量被使用,会先替换变量值。如 果想要将一些内容写入文件,除了常规的方法外,也可以使用 Here Document。如果写入 的内容中包含变量,在写入文件时要先将变量替换成实际值,在结合 cat 命令完成写入。

4.1 cat命令

4.2 重定向写入文件

4.3 使用变量

4.4 整行内容作为变量输出结果

4.5 忽略显示tab键

在标记符前加上-不显示tab键但是显示空格键

二、expect

1. expect定义:

建立在tcl(tool command language)语言基础上的一个工具,常被用于进行自动化控制和测试,解决shell脚本中交互的相关问题。

使用expect命令前需要先进行安装tcl与expect软件,在安装expect软件自动安装依赖包tcl
先检查系统内是否安装expect软件包。

rpm -q expect

rpm -q tcl

格式

expect [选项] [ -c cmds ] [ [ -[f|b] ] cmdfile ] [ args ]

expect中相关命令

  • spawn 启动新的进程(监控,捕捉)

spawn passwd root

  • expect 从进程接收字符串

  • send 用于向进程发送字符串

  • exp_continue 匹配多个字符串在执行动作后加此命令

  • interact 允许用户交互expect eof

2. expect基本命令:

(1)脚本解释器

expect 脚本中首先引入文件,表明使用的事哪一种shell

#!/usr/bin/expect

(2)spawn 

spawn 后面通常跟一个Linux执行命令,表示开启一个会话、进程,并跟踪后续交互信息

(3)expect

  • 判断上次输出结果中是否包含指定的字符串,如果有则立即返回,否则就等待超时时间后返回
  • 只能捕捉有swpan启动的进程输出;
  • 用于接受命令执行后的输出,然后和期望的字符串匹配

(4)send

向进程发送字符串,用于模拟用户的输入;

该命令不能自动回车换行,一般要加 \r (回车) 或者\ n

方式一:
expect "密码" {send "abc123\r"}     #同一行send部分要有{}

方式二:
expect "密码"  
send "abc123\r"                    # 换行send部分不需要有{}


方式三:
expect 支持多个分支
expect          #只要匹配了其中一个情况,执行相应的send 语句后退出该expect 语句
只匹配一次
expect
{
{"密码1"  {send "abc123\r"}
{"密码2"  {send "123123\r"}
{"密码3"  {send "123456\r"}

}

(5)结束符 

expect eof

表示交互结束,等待执行结束,退回到原用户,与spawn对应

比如切换到root用户,expect 脚本默认的等待时间是10s,当执行王命令后,默认停留10s后,自动切回原用户.

interact

执行完成后保持交互状态, 把控制权交给控制台,会停留在目标终端而不是退回到原终端,这时候就可以手工操作了,interact后命令不再起作用,比如interact后添加exit,并不会退出root用户。而如果没有interact则登录完成后会退出,而不是留在远程终端上。

使用interact会保持在终端而不会退回原终端,比如切换到root用户,会一直在root用户状态下;比如ssh到另一台服务器,会一直在目标服务器终端而不会切回原服务器。

需要注意的是,expect eof 与 interact 只能二选一

(6)set

expect 默认的超时时间是10秒,通过set 命令可以设置会话超时时间,若不限制超时时间则应设置为-1

(7)exp_continue 

exp_continue 表示允许 expect 继续向下执行指令.

exp_continue附加于某个expect 判断选项之后,可以是该项被匹配后还能继续匹配expect 判断语句内的其他项。exp_continue类似于控制语句的continue语句。表示允许expect继续向下执行命令。

(8)send_user

表示回显命令与echo相同

(9)接收参数(位置变量)

expect 脚本可以接受从bash命令行传递参数,使用 [lindex $argv n]获得。其中你从0开始,分别表示第一个,第二个,第三个.....参数

3. expect操作

3.1 ssh远程登陆

3.2 切换用户脚本

#!/usr/bin/expect
#设置超时时间
set timeout 5

set name [lindex $argv 0]
set pd [lindex $argv 1]

spawn su $name

expect "密码:" {send "$pd\n"}

expect "*]#"
send_user "hello root!"

interact

三、字符处理

1. 字符串切片

1.1 基于偏移量取字符

取字符串的长度
${#var}
#返回字符串变量var的字符的长度,一个汉字算一个字符
跳过左边的字符
${var:offset}
#返回字符串变量var中从第offset个字符后(不包括第offset个字符)的字符开始,到最后的部分,offset的取值在0 到 ${#var}-1 之间(bash4.2后,允许为负值)
${var:offset:number}
#返回字符串变量var中从第offset个字符后(不包括第offset个字符)的字符开始,长度为number的部分
取字符串右边的字符
${var: -length}
#取字符串的最右侧几个字符,取字符串的最右侧几个字符, 注意:冒号后必须有一空白字符
掐头去尾
${var:offset:-length}
#从最左侧跳过offset字符,一直向右取到距离最右侧lengh个字符之前的内容,即:掐头去尾
取倒数的范围
${var: -length:-offset}
#先从最右侧向左取到length个字符开始,再向右取到距离最右侧offset个字符之间的内容,注意:-length前空格,并且length必须大于offset

1.2 基于模式取子串

删左留右
${var#*word}
#其中word可以是指定的任意字符,自左而右,查找var变量所存储的字符串中,第一次出现的word, 删除字符串开头至第一次出现word字符串(含)之间的所有字符,即懒惰模式,以第一个word为界删左留右

#同上,贪婪模式,不同的是,删除的是字符串开头至最后一次由word指定的字符之间的所有内容,即贪婪模
式,以最后一个word为界删左留右
${var##*word}
删右留左
${var%word*}
#其中word可以是指定的任意字符,功能:自右而左,查找var变量所存储的字符串中,第一次出现的word, 删除字符串最后一个字符向左至第一次出现word字符串(含)之间的所有字符,即懒惰模式,以从右向左的第一个word为界删右留左


${var%%word*}
#同上,只不过删除字符串最右侧的字符向左至最后一次出现word字符之间的所有字符,即贪婪模式,以从右向左的最后一个word为界删右留左

2. 查找替换

${var/pattern/substr}
${变量/搜索的字符串/修改的字符串}
#查找var所表示的字符串中,第一次被pattern所匹配到的字符串,以substr替换之

${var//pattern/substr}
#查找var所表示的字符串中,所有能被pattern所匹配到的字符串,以substr替换之

${var/#pattern/substr}
#查找var所表示的字符串中,行首被pattern所匹配到的字符串,以substr替换之
#在此处  #代表开头

${var/%pattern/substr}
#查找var所表示的字符串中,行尾被pattern所匹配到的字符串,以substr替换之
#在此处  %代表结尾

3. 查找并删除

${var/pattern}
#删除var表示的字符串中第一次被pattern匹配到的字符串

${var//pattern}
删除var表示的字符串中所有被pattern匹配到的字符串

${var/#pattern}
删除var表示的字符串中所有以pattern为行首匹配到的字符串

${var/%pattern}
删除var所表示的字符串中所有以pattern为行尾所匹配到的字符串

4. 大小写转换

${var^^}
#把var中的所有小写字母转换为大写

${var,,}
#把var中的所有大写字母转换为小写

高级变量

相关推荐

  1. Shell

    2024-03-20 03:10:02       9 阅读
  2. 字符处理与高级变量

    2024-03-20 03:10:02       27 阅读
  3. Shell 编程之

    2024-03-20 03:10:02       7 阅读
  4. Shell编程之

    2024-03-20 03:10:02       9 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-20 03:10:02       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-20 03:10:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-20 03:10:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-20 03:10:02       18 阅读

热门阅读

  1. 【前端】字典获取过程

    2024-03-20 03:10:02       16 阅读
  2. XML语言的学习记录3-解析

    2024-03-20 03:10:02       19 阅读
  3. 简述从浏览器发出请求到数据返回的全过程

    2024-03-20 03:10:02       20 阅读
  4. UE5.1_自定义配置文件读取

    2024-03-20 03:10:02       19 阅读
  5. KMP算法

    2024-03-20 03:10:02       21 阅读
  6. 抽象类abstract

    2024-03-20 03:10:02       19 阅读