一、字符串截取
":"代表截取
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段里面最后一条命令不会执行
原文地址:http://blog.51cto.com/355665/2071218