基础知识
expect基础知识
- exp_continue是匹配一行后,从当前expect块第一行开始匹配
- expect块的每一行匹配后,直接退出当前expect块,往下一个expect块开始匹配
- expect块需要send的信息中包含双引号 ”“ ,需要进行 转义
shell基础知识
脚本其实就是短小的、用来让计算机自动化完成一系列工作的程序,这类程序可以用文本编辑器修改,不需要编译,通常是解释运行的。
变量
用语句给变量赋值
for file in `ls /etc` 或 for file in $(ls /etc) 或 ip=`awk '{ print $1 }' iplist` # 变量能重新赋值,使用变量可以用$ip、${ip} 或 ip=$(awk '{ print $1 }' iplist)
函数
- 所有函数在使用前必须定义。这意味着必须将函数放在脚本开始部分,直至shell解释器首次发现它时,才可以使用。调用函数仅使用其函数名即可。
- 在函数体内部,当n>=10时,需要使用${n}来获取参数。
- 函数返回值在调用该函数后通过 $? 来获得。
处理参数列表
参数处理 | 说明 |
---|---|
$# | 传递到脚本的参数个数 |
$* | 以一个单字符串显示所有向脚本传递的参数 |
$$ | 脚本运行的当前进程ID号 |
$! | 后台运行的最后一个进程的ID号 |
$@ | 与$*相同,但是使用时加引号,并在引号中返回每个参数。 |
$- | 显示Shell使用的当前选项,与set命令功能相同。 |
$? | 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。 |
$@与$*加引号时区别:$@在引号中返回每个参数
#!/usr/bin/bash source ./color.sh # "$*" echo -e "${RED}"$ *":" for i in "$*";do echo -e "${RED}$i${CLOSE_ALL}" done echo -e " " # "$@" echo -e "${BLUE}"$ @":" for i in "$@";do echo -e "${BLUE}$i${CLOSE_ALL}" done
结果截图
输入/输出重定向
输入/输出重定向列表
命令 | 说明 |
---|---|
command > file | 将输出重定向到 file。 |
command < file | 将输入重定向到 file。 |
command >> file | 将输出以追加的方式重定向到 file。 |
n > file | 将文件描述符为 n 的文件重定向到 file。 |
n >> file | 将文件描述符为 n 的文件以追加的方式重定向到 file。 |
n >& m | 将输出文件 m 和 n 合并。 |
n <& m | 将输入文件 m 和 n 合并。 |
<< tag | 将开始标记 tag 和结束标记 tag 之间的内容作为输入。 |
文件描述符 0 通常是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)。
实例
$ command1 < infile > outfile
同时替换输入和输出,执行command1,从文件infile读取内容,然后将输出写入到outfile中。command 命令将 stdin 重定向到 file1,将 stdout 重定向到 file2。
$ command > file 2>&1
$ find /etc -name "*.txt" > list 2>&1
stdout 和 stderr 合并后重定向到 file。先将要输出到stdout的内容重定向到文件,此时文件list就是这个程序的stdout,再将stderr重定向到stdout,也就是文件list。此时屏幕不显示信息,在list中显示,通过cat list查看。
$ command 2>&1 > file
$ find /etc -name "*.txt" 2>&1 >list
stderr重定向到stdout,stdout重定向到file。先将要输出到stderr的内容重定向到stdout,此时会产生一个stdout的拷贝,作为程序的stderr,而程序原本要输出到stdout的内容,依然是对接在stdout原身上的,
因此第二步重定向stdout,对stdout的拷贝不产生任何影响。此时屏幕会输出错误信息,标准输出在list中显示,通过cat list查看。
$ command > /dev/null 2>&1
屏蔽 stdout 和 stderr,不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null。/dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。
文件包含
. filename
或
source filename
包含外部脚本。这样可以很方便的封装一些公用的代码作为一个独立的文件。如实例中batch.sh通过source包含color.sh脚本。
实例1、批量登录远程Linux服务器
包括4个文件:batch.sh(批量管理expect登录脚本)color.sh(颜色脚本)、sshLogin.exp(expect登录脚本)、iplist(用于登录的IP、用户名和用户密码)
batch.sh(批量管理expect登录脚本)
#!/usr/bin/bash source ./color.sh callSSH() { # $$:pid $1:filename $2:username $3:ip $4:password echo -e "$GREEN Param init(pid: $$): $1 $2 $3 $4 $CLOSE_ALL" expect $1 $2 $3 $4 return $? } sshManage() { i=1 for ip in `awk 'NR>2 {print $1}' iplist` do user=$(awk -v IP=$ip '{if(IP==$1) print $2}' iplist) password=`awk -v IP=$ip '{if(IP==$1) print $3}' iplist` if [ $i -le 9 ] then i="0$i" else i="$i" fi echo -e "$BLUE<<-------------- Login $ip($i) begin -------------->>$CLOSE_ALL" callSSH sshLogin.exp $user $ip $password echo -e "${BLUE}return_value = $? $CLOSE_ALL" echo -e "$BLUE<<-------------- Login $ip($i) end-------------->>$CLOSE_ALL" let "i++" done } echo -e "$RED<<<<<<<<<<<<<<<<<<<<<< sshManage begin >>>>>>>>>>>>>>>>>>>>>>$CLOSE_ALL" sshManage echo -e "$RED<<<<<<<<<<<<<<<<<<<<<< sshManage end >>>>>>>>>>>>>>>>>>>>>>$CLOSE_ALL"
color.sh(颜色脚本)
#!/usr/bin/bash # Example: # echo -e "