基础知识

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 "\n" # "$@"
echo -e "${BLUE}\"$ @\":"
for i in "$@";do
echo -e "${BLUE}$i${CLOSE_ALL}"
done

test.sh

结果截图

输入/输出重定向

输入/输出重定向列表

命令 说明
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 >&1
$ find /etc -name "*.txt"  > list 2>&1

stdout 和 stderr 合并后重定向到 file。先将要输出到stdout的内容重定向到文件,此时文件list就是这个程序的stdout,再将stderr重定向到stdout,也就是文件list。此时屏幕不显示信息,在list中显示,通过cat list查看。

$ command  >& > 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 >&

屏蔽 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 $:filename $:username $:ip $:password
echo -e "$GREEN Param init(pid: $$): $1 $2 $3 $4 $CLOSE_ALL"
expect $ $ $ $
return $?
} sshManage() {
i=
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 ]
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"

batch.sh

color.sh(颜色脚本)

#!/usr/bin/bash

# Example:
# echo -e "\033[字背景颜色;文字颜色m 字符串 \033[0m"
# echo -e "\033[41;36m something here \033[0m"
# echo -e "$RED something here $CLOSE_ALL" # font color: -
BLACK="\033[30m" # 黑色
RED="\033[31m" # 红色
GREEN="\033[32m" # 绿色
YELLOW="\033[33m" # 黄色
BLUE="\033[34m" # 蓝色
PURPLE="\033[35m" # 紫色
SKY_BLUE="\033[36m" # 天蓝色
WHITE="\033[37m" # 白色 # blackground color: -
BLACK_WHITE="\033[40;37m" # 黑底白字
RED_WHITE="\033[41;37m" # 红底白字
GREEN_WHITE="\033[42;37m" # 绿底白字
YELLOW_WHITE="\033[43;37m" # 黄底白字
BLUE_WHITE="\033[44;37m" # 蓝底白字
PURPLE_WHITE="\033[45;37m" # 紫底白字
SKY_BLUE_WHITE="\033[46;37m" # 天蓝底白字
WHITE_BLACK="\033[47;30m" # 白底黑字 # Control options
CLOSE_ALL="\033[0m" # 关闭所有属性
HIGH_BRIGHTNESS="\33[1m"  # 设置高亮度
UNDERLINE="\33[4m"  # 下划线
FLICKER="\33[5m"  # 闪烁
REVERSE_DISPLAY="\33[7m"  # 反显
SET_FOREGROUND="\33[30m — \33[37m" # 设置前景色
SET_BACKGROUND="\33[40m — \33[47m" # 设置背景色
SET_CURSOR_POS="\33[y;xH" # 设置光标位置
N_CURSOR_UP="\33[nA"  # 光标上移n行
N_CURSOR_DOWN="\33[nB"  # 光标下移n行
N_CURSOR_RIGHT="\33[nC"  # 光标右移n行
N_CURSOR_LEFT="\33[nD"  # 光标左移n行
CURSOR_POS_SAVE="\33[s"  # 保存光标位置
CURSOR_POS_RECOVER="\33[u"  # 恢复光标位置
CURSOR_HIDE="\33[?25l"  # 隐藏光标
CURSOR_DISPLAY="\33[?25h"  # 显示光标
CLEAR_SCREEN="\33[2J"  # 清屏
CLEAR_CONTENT="\33[K"  # 清除从光标到行尾的内容

color.sh

sshLogin.exp(expect登录脚本)

#!/usr/bin/expect

if { $argc !=  } {
send -- "Usage: expect sshLogin.exp username ip password\n"
exit
} #Param
set userName [lindex $argv ]
set IP [lindex $argv ]
set password [lindex $argv ]
set timeout spawn ssh -P22 $userName@$IP
expect {
eof { exit }
timeout { exit }
"*password*" { send -- "$password\n" }
"*(yes/no)?*" { send -- "yes\n";exp_continue }
} expect {
eof { exit }
timeout { exit }
"*#*" { send -- "find /etc -names \"*.txt\" >list 2>&1\n" }
} expect {
eof { exit }
timeout { exit }
"*#*" { send -- "cat list\n" }
} set timeout
expect {
eof { exit }
timeout { exit }
"*#*" { send -- "\n" }
} expect {
eof { exit }
timeout { exit }
"*#*" { send -- "exit\n" }
}
expect eof
exit

sshLogin.sh

iplist(用于登录的IP、用户名和用户密码)

#ip username password

10.10.3.128 root ******
10.10.1.21 root ******

iplist

结果截图

实例2、批量激活脚本

#!/bin/bash
chmod spv*.bin
./spv*.bin
echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
eth=`ifconfig |awk '{print $1}' | awk 'NR==1{print}' | awk -F':' '{print $1}'`
ip=`ifconfig $eth | grep netmask |awk '{print $2}'| awk -F '.' '{print $4}'`
mv /tmp/spv_License/spv_License/License$ip.txt /home/spv/config/spvlicense
chown apache.apache /home/spv/config/spvlicense mysql -uuser -ppassword dbname -e "insert into user_role (userID,roleID) values (100,1);" #echo "first code is:"
#cat /tmp/spv_License/spv_License/
code=`cat /tmp/spv_License/spv_License/$ip\_license.txt`
#echo "first code is:$code"
echo -e "\033[35m first code is:$code \033[0m" #echo "please reboot this hac now"
if [ $? == ];
then
echo -e "\033[35m Import license success,please reboot this hac now. \033[0m"
else
echo -e "\033[31m Import license failure,please Import license by yourself ! \033[0m"
fi
/tmp/spv_License/spv_License目录下的文件,包含所有的激活文件。

eth为ifconfig下的第一列中的第一行以逗号分隔的第一个字段。也就是eth0。

ip为ifconfig eth0下的查找关键字netmask所在行的第二个字段下以逗号分隔的第四个字段,也就是126。

连接MySQL数据库,执行SQL:mysql -uuser -ppassword -e " sql "

chown将spvlicense文件的拥有者改为apache.apache

												

很有用的shell脚本的更多相关文章

  1. 一个有用的shell脚本

    #!/bin/bash #if [ $1 -eq null ]; then # echo "please input params1!" # exit #fi #if [ $2 - ...

  2. Shell脚本编程的常识

    (这些往往是经常用到,但是各种网络上的材料都语焉不详的东西,个人认为比较有用) 七种文件类型 d            目录                                       ...

  3. shell脚本编程常识

    (这些往往是经常用到,但是各种网络上的材料都语焉不详的东西,个人认为比较有用) 七种文件类型 d            目录                                       ...

  4. SHELL脚本编程的常识和VI常用技巧

    来源:http://mprc.pku.edu.cn/mentors/training/TrainingCourses/material/ShellProgramming.HTM#_Toc3751808 ...

  5. Shell脚本学习指南 [ 第一、二章 ] 背景知识、入门

    摘要:第一章介绍unix系统的发展史及软件工具的设计原则.第二章介绍编译语言与脚本语言的区别以及两个相当简单但很实用的Shell脚本程序,涵盖范围包括了命令.选项.参数.Shell变量.echo与pr ...

  6. nginx日志切割(logrotate或shell脚本)

    nginx自己不会对日志文件进行切割,可以通过两种不同的方式进行,分别是:通过logrotate和通过shell脚本. 如果是yum方式安装的nginx,系统默认会自动通过logrotate这个日志管 ...

  7. Shell脚本实现每个工作日定时执行指定程序

    我们可能会遇到这样的情景:必须在每个工作日定时执行Linux服务器上的某个程序.那么有没有办法实现这一功能呢?答案是肯定的.我们可以运用Shell脚本简单实现这一功能. 原理很简单,Shell脚本内部 ...

  8. 【转】shell脚本写的俄罗斯方块游戏

    亲测一个很好玩的shell脚本写的俄罗斯方块游戏,脚本来自互联网 先来讲一下思维流程 一.方块的表示 由于shell不能定义二维数组,所以只能用一维数组表示方块,俄罗斯方块主要可以分为7类,每一类方块 ...

  9. 统计网卡流量的两段shell脚本(使用ifconfig)

    一个很小巧的shell脚本,使用ifconfig的不间断输出来统计网卡的流量,有需要的朋友可以参考下 使用shell脚本计算Linux网卡流量,方法中最关键点: ifconfig $eth_name ...

随机推荐

  1. spring配置注解context:annotation-config和context:component-scan区别

    Spring 中在使用注解(Annotation)会涉及到< context:annotation-config> 和 < context:component-scan>配置, ...

  2. SLC cache功能

    由于TLC需要多次编程,且未全部编程时wordLine处于不稳定状态,所以一般都会划出一部分区域作为SLC cache使用 SLC cache主要功能是,SSD接收到写命令后,先将数据写入SLC ca ...

  3. linux ctrl 快捷键

    ctrl+a: 光标跳到行首. ctrl+b: 光标左移一个字母. ctrl+c: 杀死当前进程. ctrl+d: 删除光标后一个字符或exit.logout. ctrl+e: 光标移到行尾. ctr ...

  4. jps 命令

    NAME jps - Lists the instrumented Java Virtual Machines (JVMs) on the target system. This command is ...

  5. springboot整合filter

    新建一个项目 新建Firstfilter类 Firstfliter.java package com.example.filter; import java.io.IOException; impor ...

  6. FileSystemResource 找不到文件

    环境 Spring 3.2.5.RELEASE 原因 使用 FileSystemResource 加载文件的过程中,发现一个奇怪的现象,路径完全正确,但是找不到文件的情况.可能的原因是文件的路径上有压 ...

  7. Android Application的Gradle说明

    //引入插件 apply plugin: 'com.android.application' android { compileSdkVersion 29 buildToolsVersion &quo ...

  8. php通过session来实现登录验证

    1.概述 这几天在做一个内部统计管理系统,所有内容需要登录后才能查看.这就需要系统内部每个模块都有登录验证的功能.在网上找了一圈资料,决定用session来做. 2.系统概况 后端语言:php(用的是 ...

  9. 8.bash编辑命令行

    8.编辑命令行本章介绍 GNU 命令行编辑界面的基本功能.命令行编辑是 Readline 库提供的:这个库被几个不同的程序共用,Bash 是其中一个.使用交互式的 shell 时,默认已经打开了命令行 ...

  10. GridView直接打印

    /// <summary> /// 打印功能 /// </summary> /// <param name="panel">打印控件</p ...