shell字符串处理-数组-expect
把当前系统前10个系统用户名 和 uid号输出到屏幕上head/etc/passwd
字符串截取
1${变量名:起始位置:长度}
echo ${变量名:起始位置:长度}
变量名=${变量名:起始位置:长度}
806echo $HOSTNAME
808${HOSTNAME:0:3}
809echo ${HOSTNAME:0:3}
810echo $HOSTNAME
811echo ${HOSTNAME:0:5}
812domain=${HOSTNAME:0:5}
813echo $domain
814domain=${HOSTNAME:6}
2使用 expr substr
# echo $HOSTNAME
pc205.tarena.com
#
# expr substr "$HOSTNAME" 1 5
pc205
# expr length "$HOSTNAME"
16
# expr length "panglijing"
10
#
3使用cut工具
echo $var | cut -b 起始位置-结束位置
echo$HOSTNAME|cut-b 1-5
echo$HOSTNAME|cut-b 6-
head-3/etc/passwd|cut -d":"-f1,3
4 路径分割
basename
dirname
# basename /etc/sysconfig/network-scripts/ifcfg-eth0
ifcfg-eth0
#
#
# basename /etc/passwd
passwd
# basename /etc/sysconfig/network-scripts
network-scripts
# basename /etc/sysconfig/network-scripts
network-scripts
#
# dirname /etc/sysconfig/network-scripts/ifcfg-eth0
/etc/sysconfig/network-scripts
#
# dirname /etc/sysconfig/network-scripts
/etc/sysconfig
#
+++++++++++++++++++++++++++++++++++++++++++++++++
字符串替换
${var/old/new}
${var//old/new}
name=panglijing
# echo ${name/i/F}
panglFjing
# echo ${name//i/F}
panglFjFng
# echo $name
panglijing
# newname=${name//i/F}
# echo $newname
panglFjFng
#
按条件掐头去尾
${var 替换符号 表达式}
echo ${var 替换符号 表达式}
变量名=${var 替换符号 表达式}
表达式的表示方法
通配符
普通字符
通配符+普通字符
字符串删除
从左向右,把变量中与表达式匹配的数据删除
# 最短匹配删除
##最长匹配删除
从右向左,把变量中与表达式匹配的数据删除
% 最短匹配删除
%%最长匹配删除
825echo ${MAIL##*/}
826mailbox=${MAIL##*/}
827mailuser=${MAIL##*/}
828echo $mailuser
829echo $MAIL
830echo ${MAIL % /root}
831echo ${MAIL%/root}
832echo $MAIL
833echo ${MAIL%/*}
----------------------------------------------------------------------
获取字符串的部分数据
----------------------------------------------------------------------
给变量赋初值
${变量名 符号 "值"}
echo${变量名 符号 "值"}
变量名=${变量名 符号 "值"}
--------------------------------------------------------------------
:=
${var:="word"}
若变量var已存在且非Null,则返回 $var 的值,
否则返回字串“word”,并赋值给变量 var
---------------------------------------------------------------------
:+
${var:+"word"}
若变量var已存在且非Null,则返回字串“word”,反之返回null值。
作用:判断一个是否定义。
----------------------------------------------------------------------
:-
${var:-"word"}
若变量var已存在且非Null,则返回 $var 的值
否则返回字串“word”,变量var值不变。
----------------------------------------------------------------------
:?
${var:?}
${var:?"word"}
若变量var已存在且非Null,则返回 $var 的值
,否则返回字串“word”,并结束脚本。
作用:输出因变量没有定义所导致的错误。
#!/bin/bash
read -p "please input numbers " x
#x=${x:-"1"}
#y=${x:="1"}
#y=${x:+"1"}
y=${x:?}
echo '$x is ' $x
echo $y
---------------------------------------------------------------------
# cat check_veryone_ip.sh
#!/bin/bash
ip=${1:-"127.0.0.1"}
ping-c3$ip&> /dev/null
if [ $? -eq0];then
echo $ipis online
else
echo $ip is not online
fi
#
+++++++++++++++++++++++++++++++++++++++++++++++++++
数组
定义数组 declare -a 数组名
赋值数组名=(lili hahaxixi)
使用数组元素 ${数组名[下标]}
输出某个数组元素的值 echo ${数组名[下标]}
查看所有数组 declare -a
查看某个数组 declare -a | grep 数组名
输出数组元素值的方式:
echo ${ 数组名[@]:N}从数组的N那一个下标开始显示元素值,默认下标值为0
echo ${数组名[@]:N:M} M共显示几个元素
向已有数组里添加新元素:数组名[下标]=值
下标没有被已有元素使用,就是向数组添加新元素
若下标已经被已有元素使用,就是修改已有元素的值
删除数组中的某个元素:unset 数组名[下标]
清空数组元素:数组名=()
删除数组变量:unset 数组名
调用数组元素:${数组名[下标]}
屏幕输入3个ip地址,保存到ipgrp数组里,并在屏幕输出第二个IP
#!/bin/bash
read -p "qing shuru yige ipdizhi: " ipa
read -p "qing shuru yige ipdizhi: " ipb
read -p "qing shuru yige ipdizhi: " ipc
ipgrp=($ipa $ipb $ipc)
echo ${ipgrp}
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++expect把交互操作,通过非交互的方式完成
rpm-qexpect||yum-yinstall expect
whichexpect
1触发交互式操作spawn
2捕获上条命令执行后,输出的数据捕获为成功expect
3捕获到数据之后发送指令 send"指令\r"
spawn ftp172.40.3.38
expect "捕获的数据"
send"指令\r"
-----------------------------------------------------------------
vimautogetfile.expect 从ftp服务器上下载文件到本机
#!/usr/bin/expect
set ip"localhost"
set username "ftp"
set password ""
set path[ lindex $argv 0 ]
set file[ lindex $argv 1 ]
spawn ftp $ip
expect "Name"
send "$username\r"
expect "Password"
send "$password\r"
expect "ftp>"
send"cd $path\r"
expect "ftp>"
send "get $file\r"
expect "ftp>"
send"bye\r"
:wq
页:
[1]