一. 字符串的截取及切割
1.1 用法
子串截取的三种用法:
${变量名:起始位置:长度}
expr substr "$变量名" 起始位置 长度
echo $变量名 | cut -b 起始位置-结束位置
子串替换的两种用法:
只替换第一个匹配结果:${变量名/old/new}
替换全部匹配结果:${变量名//old/new}
字符串掐头去尾:
从左向右,最短匹配删除:${变量名#*关键词}
从左向右,最长匹配删除:${变量名##*关键词}
从右向左,最短匹配删除:${变量名%关键词*}
从右向左,最长匹配删除:${变量名%%关键词
1.2 实例
1.2.1 字符串截取
1) 方法一:使用 ${}表达式 (格式:${变量名:起始位置:长度})
[root@client ~]# id="13579024680" [root@client ~]# echo ${#id} 11
从左侧开始截取前7个字符
[root@client ~]# echo ${id:0:7} 1357902
也可以这样表示
[root@client ~]# echo ${id::7} 1357902
如果从起始位置1开始截取7个字符,可以这样表示:
[root@client ~]# echo ${id:1:7} 3579024
2) 方法二:使用expr substr (格式:expr substr "$变量名" 起始位置 长度)
使用expr substr截取字符串时,起始编号从1开始,这个要注意与${}相区分。
从左侧截取id变量的前6个字符
[root@client ~]# echo $id 13579024680 [root@client ~]# expr substr "$id" 1 6 135790
从左侧截取id变量的第7-10个字符
[root@client ~]# expr substr "$id" 7 10 24680
3) 方法三:使用cut分割工具 (格式:echo $变量名 | cut -b 起始位置-结束位置)
选项 -b 表示按字节截取字符,其中起始位置、结束位置都可以省略。当省略起始位置时,视为从第1个字符开始(编号也是从1开始,与expr类似),当省略结束位置时,视为截取到最后。
从左侧截取前7个字符
[root@client ~]# echo $id 13579024680 [root@client ~]# echo $id | cut -b 1-7 1357902
从第7个字符截取到末尾
[root@client ~]# echo $id | cut -b 7- 24680
只截取单个字符,比如第7个字符
[root@client ~]# echo $id | cut -b 7 2
截取不连续的字符,比如第2、4、6个字符
[root@client ~]# echo $id | cut -b 2,4,6 370
1.2.2 字符串替换
1)只替换第一个子串 (格式:格式:${变量名/old/new})
就以之前的id为例,将字符串中的第一个3替换为aa:
[root@client ~]# echo ${id/3/aa} 1aa579024680
2) 替换全部子串 (格式:${变量名//old/new})
新建id1字符串,将id1字符串中所有2替换为a:
[root@client ~]# id1="1222432352" [root@client ~]# echo $id1 1222432352 [root@client ~]# echo ${id1//2/a} 1aaa43a35a
1.2.3 字符串的匹配删除
以用户的账户信息为例,定义变量mess:
[root@client ~]# mess=`head -1 /etc/passwd` [root@client ~]# echo $mess root:x:0:0:root:/root:/bin/bash
1) 最短匹配删除(从左到右) (格式:$(变量名#*关键词))
删除从左侧第1个字符到最近的关键词“:”的部分,* 作通配符理解:
[root@client ~]# echo ${mess#*:} x:0:0:root:/root:/bin/bash
2) 最长匹配删除(从左到右) (格式:$(变量名#*关键词))
删除从左侧第1个字符到最远的关键词“:”的部分:
[root@client ~]# echo ${mess##*:} /bin/bash
二. 字符串初值处理
2.1 用法
通过${var:-word}判断变量是否存在,决定是否给变量赋初始值。
2.2 实例
1)只取值,${var:-word}
若变量var已存在且非Null,则返回 $var 的值;否则返回字串“word”,原变量var的值不受影响。
以下为变量值已存在的情况:
[root@client ~]# xx=12 [root@client ~]# echo $xx 12 [root@client ~]# echo ${xx:-234} 12
以下为变量值不存在的情况:
[root@client ~]# echo ${yy:-234} 234
以下为一个脚本:(添加一个新用户同时附上密码)
[root@client ~]# cat /root/test.sh #!/bin/bash read -p "请输入用户名:" user read -p "请输入用户名:" pass [ -z $user ] && exit //如果无用户名,则脚本退出 pass=${pass:-123} //如果用户没有输入密码,则默认密码为123 useradd $user echo "$pass" | passwd --stdin $pass
三.expect预期交互
3.1 expect概述
expect是基于TCL编写的自动交互式程序
可以使用再Shell脚本中,为交互式过程中自动输送预先准备的文本或指令,无需人工的干预
触发的依据为预期会出现的特征提示文本
3.2 expect实例
ssh登录目标主机的过程中,第一次会被要求接受密钥,接着输入密码,才会提示输入密码:
[root@client ftp]# ssh root@192.168.2.5 The authenticity of host '192.168.2.5 (192.168.2.5)' can't be established. ECDSA key fingerprint is SHA256:93nqE4JplTeayQfkee9QVJ6rFJOoEX7cCzOGCXpYqFo. ECDSA key fingerprint is MD5:a3:7f:c3:ff:7b:14:a2:90:6b:a5:03:7c:ff:a2:d6:50. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '192.168.2.5' (ECDSA) to the list of known hosts. root@192.168.2.5's password: Last login: Fri Mar 15 23:45:49 2019 from 192.168.2.1 [root@proxy ~]# exit 登出 Connection to 192.168.2.5 closed.
编写expect脚本实现自动登录目标主机:
[root@client ~]# vim expect.sh #!/bin/bash expect << EOF spawn ssh 192.168.2.5 expect "password:" { send "1\r" } expect "#" { send "exit\r" } EOF [root@client ~]# chmod +x expect.sh