一. 字符串的截取及切割

 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脚本中,为交互式过程中自动输送预先准备的文本或指令,无需人工的干预

  • 触发的依据为预期会出现的特征提示文本

expect.PNG

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