shell及其脚本

一.  shell

1. shell认知

shell是用户与内核之间交互的接口,用户通过shell进行交互(命令)或非交互(shell脚本)的方式以达到对系统的操作和交互

2. shell脚本

安装一定逻辑关系记录命令的文件

第一行:#!/bin/bash     #"#!"为约定的标记,表示脚本需要什么解释器进行解释,默认脚本运行时开启的子shell

shell及其脚本

ps -xf        #表示查看所使用shell的位置指向

注:通常第一行采用#!/usr/bin/env bash,进行申明,表示不管在什么地方,将bash找到并且运行

脚本描述语的快速运行:

vim /etc/vimrc

shell及其脚本

注:map表示映射,按F4键可进行快速编写描述语

脚本内容的快速修改:

shell及其脚本

注:利用Dir=/var/log/变量关系,可以减轻工作量,进行批量修改,只需修改变量关系即可

3. 特殊符号转译和注释

\             #表示转译
''            #表示强引
""           #表示弱引

shell及其脚本

三. 常用命令

1. diff

diff hello hello.new                           #比较两个文件的不同

[num1,num2][a|c|d][num1,num2]    #表示第一个文件的第几行比第二个文件的第几行增加或替换或删除,两个文件就相同

shell及其脚本

diff -u hello hello.new > hello.path

yum install -y patch

shell及其脚本

patch hello.new hello.path              #对hello.new文件进行打补丁

shell及其脚本

注:在对文件进行打补丁时,将会保留源文件

patch -b hello hello.path      #-b表示备份原文件为hello.orig

shell及其脚本

2. grep

find查找文件,grep查找或过滤字符

grep root /mnt/passwd

shell及其脚本

grep root -i /mnt/passwd        #-i表示不区分大小写

grep -i ^root /mnt/passwd      #表示以root开头

grep -i root$ /mnt/passwd      #表示以root结尾

grep -i ^root$ /mnt/passwd    #表示以root开头和结尾

shell及其脚本

grep -i root /mnt/passwd | grep -i ^root

grep -i root /mnt/passwd | grep -i ^root -v        #-v表示反向过滤

shell及其脚本

grep -i root /mnt/passwd | grep -i -E "^root|root$" -v          

grep -i "\<root" /mnt/passwd | grep -i -E "^root|root$" -v

grep -i "root\>" /mnt/passwd | grep -i -E "^root|root$" -v

grep -i "\<root\>" /mnt/passwd | grep -i -E "^root|root$" -v        #表示含有root为整体且不以root开头和结尾

shell及其脚本

eg:

查找可登陆系统用户

grep "\<bash\>" /etc/passwd

shell及其脚本

grep -n hello passwd        #显示查找行号

grep -n2 hello passwd      #显示查找行号及上下各两行

grep -A2 hello passwd      #显示查找字符及后两行

grep -B2 hello passwd      #显示查找字符及前两行

shell及其脚本

grep hello -r /mnt/        #从目录中筛选字符及所在文件

shell及其脚本

3. cut

cut -d : -f 2 passwd               #-d指定分隔符;-f指定列,截取文件第二列

shell及其脚本

cut -d : -f 2,5 passwd           #截取文件第二和第五列

shell及其脚本

cut -d : -f 2-5 passwd           #截取文件第二到五列

shell及其脚本

cut -c 3 passwd             #-c指定字符,截取第三个字符

shell及其脚本

cut -c 1,3 passwd         #截取第一和第三个字符

shell及其脚本

cut -c 1-3 passwd         #截取第一到三个字符

shell及其脚本

eg1:

列出可登陆系统的用户名称

grep "\<bash\>" /etc/passwd | cut -d : -f 1

shell及其脚本

eg2:

编写脚本,通过输入网卡名称获取ip---awk

awk -F ":" -v TEST=$TEST 'BEGIN {print TEST ":"} {print $2} END{print TEST}' 文件

shell及其脚本

注:sh -x执行脚本时,可查看脚本执行过程

4. echo


5. sed

sed 's/sbin/westos/g' passwd         #全文替换sbin为westos,属于临时生效

shell及其脚本

sed '1,5s/sbin/westos/g' passwd           #替换1-5行

shell及其脚本

sed '/adm/,/sync/s/sbin/westos/g' passwd          #替换从adm此行到sync此行

shell及其脚本

sed 's/sbin/westos/g' -i passwd              #全文替换并保存

shell及其脚本

sed -e 's/sbin/westos/g' -e 's/nologin/linux/g' passwd        #同步进行替换

shell及其脚本

cat -n passwd | sed 5p                    #重复查看第5行

shell及其脚本

cat -n passwd | sed 5d                  #查看第五行以外的

cat -n passwd | sed -n 5p              #只查看第五行

shell及其脚本

eg1:

编写shell脚本,通过执行脚本写出httpd端口数值进行直接改变

shell及其脚本

eg2:

编写shell脚本,通过文件执行shell脚本,使得文件中的用户可以直接通过运行shell脚本进行创建

shell及其脚本

注:sed 's/enabled\ =\ 1/enabled\ =\ 0/g' -i 文件    #表示将文件中'enabled = 1'替换成'enabled = 0'

四. 变量

export a=1           #环境级,只针对当前环境生效,当前环境关闭,变量失效

shell及其脚本

vim .bash_profile                   #用户级,只针对配置过的用户生效,其他用户无法使用

source .bash_profile             #source刷新方能生效

shell及其脚本

vim /etc/profile            #系统级

shell及其脚本

脚本执行路径:

环境级:

shell及其脚本

用户级:

vim .bash_profile

source .bash_profile

shell及其脚本

系统级:

vim /etc/profile

shell及其脚本

1. 命令别名设定

ls与/usr/bin/ls区别:

shell及其脚本

vim别名'xie'的设定

环境级:alias xie='vim'

shell及其脚本

系统级:

vim /etc/bashrc       #alias xie='vim'

source /etc/bashrc

shell及其脚本

注:因为已读取的原因,删除仍然生效

shell及其脚本

eg:创建用户并设定密码

shell及其脚本

注:编写脚本可以通过提示,进行创建,删除,退出

2. 变量定义

1> USER=root

2> $0 $1 $2 $3 $n $* $# $?

3> read -p " " IP

eg:

read -p "please input you want create username: " USERNAME
read -p "please input a password for $USERNAME: " -s PASSWORD    #-s表示不显示密码

shell及其脚本

3. 函数定义

TEST()
{
        echo hello world
}

TEST

eg1:

shell及其脚本

注:关键在于设定函数READ和ACTION_DO,当ACTION_DO执行过程中与READ相匹配时,执行相对应的动作,最后再次执行函数是为达到循环的效果

shell及其脚本

eg2:检测哪台主机可以连接

shell及其脚本

注:ping -c1 -w1 $IP &> /dev/null && echo $IP is up ||echo $IP is down表示如果ping通就输出up,不通就输出down

4. 变量对比

test = [ ]

shell及其脚本

注:"!"表示否定

"-a"表示并且,"-o"表示或者

shell及其脚本

"-eq"表示等于;"-ne"表示不等于;"-gt"表示大于;"-ge"表示大于等于;"-lt"表示小于;"-le"表示小于等于

shell及其脚本

eg:

shell及其脚本

"-n"表示目标不为空,"-z"表示目标为空

shell及其脚本

eg:

shell及其脚本

拓展:

shell及其脚本

shell及其脚本

"-e"表示存在;"-b"表示block;"-f"表示file;"-d"表示directory;"-S"表示socket;"-L"表示link;"-ot"表示前者比后者老或者旧"-nt"表示前者比后者新

shell及其脚本

eg:

shell及其脚本

五. 四则运算

1. 运算法则

++    i++        i=i+1
--      i--          i=i-1

shell及其脚本

+=    j+=i       j=j+i
-=     j-=i        j=j-i

shell及其脚本

+

-
*
/
**
%

shell及其脚本

shell及其脚本

shell及其脚本

2. 运算命令

$[ 3 + 2 ]

let A=3+2

expr 3+2

eg1:10s倒计时

shell及其脚本

注:echo -ne "\r    \r"表示刷新前一秒的记录

eg2:1m10s倒计时

shell及其脚本

拓展:备份数据库

shell及其脚本

延伸1:

shell及其脚本

注:"$?" == "0"表示命令没有出错

延伸2:

shell及其脚本

测试:

shell及其脚本

六. 脚本中的常用语句

1.

for                             #定义变量及变量范围

do                             #执行的命令操作

done

eg:创建用户并逐行对应密码

shell及其脚本

2.

while

do

done

eg:

shell及其脚本

3.

if              #表判断,假设

then         #执行假设所对应动作

elif           #再次假设

then         #执行假设所对应动作

else         #逻辑关系所对应的最后一种假设,并执行相应动作

fi

eg:

shell及其脚本

测试:

shell及其脚本

4.

case       #对条件同时访问,不同于if,需要逐个假设

shell及其脚本

5.

.expect

yum install -y expect

eg1:

shell及其脚本

注:lindex $argv 0 为命令后第一个字符串,exp_continue为不退出expect环境继续执行后续动作

eg2:只显示被连接主机的主机名

方式一:

shell及其脚本

方式二:

shell及其脚本

注:以上方式均为在shell中进入expect环境,在shell中才可利用sh执行脚本

eg3:检测在某一ip范围内开机的主机名
shell及其脚本

注:continue为继续执行动作,exit为退出脚本,break为换行

eg4:检测ip在某一范围内可连接的主机,并在可连主机上创建用户并设定逐行相对应的密码

shell及其脚本

测试:

shell及其脚本