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 $user@$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 $user@$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段里面最后一条命令不会执行



本文转自 goldwinner 51CTO博客,原文链接:http://blog.51cto.com/355665/2071218,如需转载请自行联系原作者
相关文章
|
2天前
|
存储 安全 算法
做50个Java字符串题即精通字符串
字符串常量池是 Java 堆内存的一个特殊存储区域,用于存储字符串字面量和字符串常量。Java 虚拟机为了节省内存空间和提高效率,会确保所有的字符串字面量只包含一份,这样如果有多个引用指向相同的字面量,它们实际上会指向内存中相同的位置。字符串不可变性意味着一旦字符串对象被创建,它所包含的字符序列就不能被更改。Java 中的String对象是不可变的,因为不可变性可以提供编译时的优化、线程安全性,以及因为字符串常量池而更好的内存效率。
111 0
|
2天前
|
机器学习/深度学习 Java
java字符串练习题3、字符串中字符是否相同判断
java字符串练习题3、字符串中字符是否相同判断
29 0
|
2天前
字符和数组问题
字符和数组问题
|
5月前
|
C++
C/C++判断字符串是否为另一字符串的子字符串
C/C++判断字符串是否为另一字符串的子字符串
66 0
字符串转数组、数组转字符串、给第一个单词色值
字符串转数组、数组转字符串、给第一个单词色值
|
9月前
|
JavaScript 前端开发 Java
数组转字符串( 字符串转数组~
数组转字符串可以使用不同的方法,具体取决于编程语言和上下文环境。以下是一些通用的示例:
|
9月前
|
测试技术 索引
根据首尾字符串截取中间字符串
今天分享一个函数:虽然它非常简单,但是真的很好用!也很常用!比如 “我今天真的很高兴” 这句话,要把 `今天` 截取出来,我们可以直接调用函数拿到结果,不需要匹配索引、也不用写正则!
54 0
|
11月前
逆序字符串 和 字符串的逆序输出 的区别~
逆序字符串 和 字符串的逆序输出 的区别~
89 0
|
11月前
字符串截取
字符串截取
37 0
|
11月前
利用函数求字符串长度
利用函数求字符串长度
48 0