Day04 字符串截取&字符串初值&数组&字符串替换

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Day04 字符串截取&字符串初值&数组&字符串替换相关的知识,希望对你有一定的参考价值。

一、字符串截取

":"代表截取

1.1 ${var:起始位置:长度}

起始位置从0开始(为0可以省略)
x=13918581996
echo ${x::5}#只取前5位数字
13918

1.2 expr substr "$var" 起始位置 长度

起始位置从1开始
x=13918581996
expr substr "$x" 1 5
13918

1.3 cut -b 起始位置-结束位置

按照顺序截取,起始位置从1开始
echo $x|cut -b 1-5
13918

1.3.1 cut -b 位置1,位置2,位置3

echo $x|cut -b 1,2,3,4,5
13918
echo $x|cut -b 5,4,3,2,1
13918

二、路径分割

2.1 dirname "$var"

截取目录位置
y=/etc/httpd/conf/httpd.conf
dirname $y
/etc/httpd/conf

2.2 basename "$var"

截取文件位置
y=/etc/httpd/conf/httpd.conf
basename $y
httpd.conf

三、字符串替换

"/"代表替换

3.1 echo ${var/old/new}

只替换第一个匹配结果。即只把最近的一个old替换成new,"/"符号表示替换一个。花括号里面支持通配符
echo ${x/1/}
3918581996

3.2 echo ${var//old/new}

替换全部匹配结果。即把所有的old替换成new,"//"符号表示全部替换
echo ${x//1/}
39858996

四、字符串掐头去尾

"#"代表掐头;"%"代表去尾

4.1 字符串掐头

4.1.1 从左往右删(最长匹配删除)

#代表从左往右删,##表示最长匹配
我想知道root用户使用的解释器是哪个?
n=head -1 /etc/passwd
echo ${n##:} #""匹配所有 ":"符合也一样会删除
/bin/bash

4.1.2 从左往右删(最短匹配删除)

#代表从左往右删,最短匹配
我想知道root用户是否配置了密码?
n=head -1 /etc/passwd
echo ${n#*:}
x:0:0:root:/root:/bin/bash

4.2 字符串去尾

4.2.1 从右往左删(最长匹配删除)

%代表从右往左删,%%表示最长匹配
我想知道passwd的第一行用户是谁?
n=head -1 /etc/passwd
echo ${n%%:*}
root

4.2.2 从右往左删(最短匹配删除)

%代表从右往左删,最短匹配
我想把root的用户的解释器删掉
n=head -1 /etc/passwd
echo ${n%:*}
root:x:0:0:root:/root

五、字符串初值判断

5.1 echo ${var:-value}

若变量var已存在且非Null,则返回 $var的值;否则返回字串“value”
即尝试显示$var的值,如果之前有赋值就显示赋值内容;如果变量不存在或未赋值,则显示:-后面的value
echo ${pass:-123456}
123456 #此时显示的是value
pass=8888
echo ${pass:-123456}
8888#现在显示的是给$pass赋的值

六、数组

6.1 定义

一个变量可以存多个值,值默认为文本,用在数学运算中时,自动将其转换为整数。数组最大的好处是如果要存的值数量很多,可以在一行里面定义完成
6.2数组赋值格式

6.2.1 数组名=(值1 值2 值3 ...)

整体赋值,下标从0开始
SVRS=(www ftp mail game)
echo ${SVRS[]}
www ftp mail game
还可以对值进行修改
SVRS[3]=bbs
echo ${SVRS[
]}
www ftp mail bbs

6.2.2 数组名[下标]=值

为单个元素赋值,下标从0开始
FQDN[0]=www.tmooc.cn
FQDN[1]=www.baidu.com

6.3 输出数组元素

6.3.1 ${数组名[下标]}

输出单个数组元素

6.3.2 ${数组名[@]}

获取所有数组元素

6.3.3 ${#数组名[@]}

获取所有数组元素个数

6.3.4 ${数组名[@]:起始下标:元素个数}

获取连续的多个数组元素

6.3.5 ${#数组名[下标]}

获取某个元素的长度

6.3.6 ${数组名[下标]:起始下标:字符数}

截取单个数组元素的一部分(包含起始下标字符本身)

七、expect预期交互

7.1 简介

基于TCL语言编写的自动交互式程序,可以用在Shell脚本中,为交互式过程自动输送预先准备的文本或者指令,而无需人工干预。
触发条件是预期会出现的特征提示文本,只要出现就给命令,只要出现就发文本等等

7.2 格式

#!/usr/bin/expect #指定脚本解释器
set host #定义变量
set timeout #定义超时时间,单位为秒
spawn #创建交互式进程壳
expect {
"特征文本" {send "命令"}
} #根据特征文本执行相应命令
exp_continue #前面的exepct条件满足后,继续执行后面的语句
interact #expect脚本执行完毕后不退出,控制权交给expect控制台

7.3 脚本示例

自动远程登录服务器执行命令后退出
bash脚本:
#!/bin/bash
host=192.168.4.7
user=root
pass="123456"
expect << EOF
spawn ssh [email protected]$host
expect "password" {set timeout 180;send "$pass\r"}
expect "#" {send "cat /etc/redhat-release\r"}
expect "#" {send "ls"}
EOF
interact
expect脚本:
#!/usr/bin/expect
set host 192.168.4.7
set user root
set pass "123456"
spawn ssh [email protected]$host
expect {
"yes" {send "yes\r" ;exp_continue}
"password" {set timeout 180;send "$pass\r";exp_continue}
"[$user\@" {send "cat /etc/redhat-release\r"}
"#" {send "ls"}
}
interact

7.4 存在问题

7.4.1 出现yes/no的情况不一定

因为有些电脑之前保存过密钥,有些没保存过

7.4.2 ssh连接比较慢导致expect脚本超时执行失败

一种办法是修改sshd的配置文件
另外一种办法是修改expect的超时计时器时间

7.4.3 在EOF段里面最后一条命令不会执行

以上是关于Day04 字符串截取&字符串初值&数组&字符串替换的主要内容,如果未能解决你的问题,请参考以下文章

python.day.04——常用数据类型:str&List

字符串截取模板 && POJ 34503080 ( 暴力枚举子串 && KMP匹配 )

Day04 文本和文件查找&账户管理&归档(ADMIN04-2)

Day04 文本和文件查找&账户管理&归档(ADMIN04-2)

截取url中的某个字符串后面的值

day18__文件处理&迭代器&生成器&三元运算