shell script

1.什么是脚本

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

在此文件有可执行权限的情况下可以用文件名称发起脚本内记录命令的执行

shell脚本是一种解释性语言,文件内记录的动作需要解释器shell

2.如何建立一个脚本

1)vim test.sh

#一般情况下脚本的结尾为".sh"这不是系统规定,但是是业界的规范

2)

#!/bin/bash

脚本头的写法,这是脚本使用的解释器,也就是默认脚本运行时开启的子shell

3)

脚本内容是用命令和命令执行的逻辑关系组成

4)

脚本执行的方式

方法一:

sh 脚本名称

方法二:

chmod +x 脚本

脚本名称调用

3.编写脚本的规范

1)脚本中应添加脚本的说明信息

Author :lee

Email [email protected]

Create_date :2017-08-21

Vesion :1.0

Description :test scripts

2)脚本中尽量不要使用中文,可用拼音代替

3)脚本中出现的()|[]|{}|<>等等成对出现的符号要一次打出,且内容中的字符要与这些符号有空格

4)脚本中的语句要一次写完再丰富内容

5)语句和宗使用的动作要缩进写入,使脚本易读

6)让vim自动添加脚本说明

map <F4> ms:call AddTitle()<cr>'s

function AddTitle()

        call append(0,"#!/bin/bash")

        call append(1,"# Author :Lee")

        call append(2,"# Email          :[email protected]")

        call append(3,"# Version        :")

        call append(4,"# Create_Date    :".strftime("%Y-%m-%d"))

        call append(5,"# Description    :")

vim /etc/vimrc

运维学习之脚本命令架构基础 4.比较、过滤、截取、输出、控制流输出

1)diff

比较两个文件的不同

diff

[num1,num2][a|c|d][num3,num4]

a 添加

c 改变

d 删除

num1,num2 第一个文件的内容

num3,num4 第二个文件的内容

创建两个文件file和file1,用命令进行对比。file在前时显示2比1少了123,file1在前时显示1比2多了123

运维学习之脚本命令架构基础

vimdiff进行对比

运维学习之脚本命令架构基础

运维学习之脚本命令架构基础

diff -r /mnt/westos /mnt/linux

diff -u file file1 > file.path

patch file file.path

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

运维学习之脚本命令架构基础

运维学习之脚本命令架构基础

运维学习之脚本命令架构基础

2)grep

grep -n #显示过滤内容所在的行

-n3 #显示过滤内容的前后三行

-A3 #前三

-B3 #后三

-i #不管大小写

-v #反向过滤

-E #匹配多个条件

^test #以字符开头

test$ #以字符结尾

"\<test" #只匹配test字符在前且无后缀

"test\>" #只匹配test在后且无前缀

下文最后过滤前后三行的命令有误,n和3应该连在一起

运维学习之脚本命令架构基础

过滤root,不区分大小写

运维学习之脚本命令架构基础

过滤root在最前或者在最后,结合使用过滤root在中间

运维学习之脚本命令架构基础

只匹配root字符在前且无多余部分,结合使用匹配root字符在中间且前后无多余部分

运维学习之脚本命令架构基础

3)cut

cut -c 1-4|1,4 每列1-4个字符,1和4列的字符

cut -d : -f 1,7 | -f 1-3 以:为分隔符,1和7列,1至7列

运维学习之脚本命令架构基础

运维学习之脚本命令架构基础

运维学习之脚本命令架构基础

grep和cut结合使用过滤掉/etc/passwd关键字所在的行然后截取以:为界的第一串字符

运维学习之脚本命令架构基础

运维学习之脚本命令架构基础

运维学习之脚本命令架构基础

运维学习之脚本命令架构基础

通过结合命令查找eth0网卡的IP并显示出来

运维学习之脚本命令架构基础

运维学习之脚本命令架构基础

4)awk

TEST="###########################"

awk -F 分隔符 -v TEST=$TEST 'BEGIN {print TEST } {print $2} END{print TEST}'

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

运维学习之脚本命令架构基础5.echo

echo -n

-e

-e "\r \r"

10秒倒计时

运维学习之脚本命令架构基础

运维学习之脚本命令架构基础

6)sed

sed 's/sbin/westos' passwd

sed '1,5s/sbin/westos/g' passwd

sed '/lp/,/shutdown/s/sbin/westos/g' passwd

sed -e 's/sbin/westos'

6.sed ##控制流输出

sed 's/nologin/westos/g' passwd ##替换输出中的nologin为westos

sed '1,5s/nologin/westos/g' passwd ##替换输出中1-5行的nologin为wesots

sed '/games/,/nobody/s/nologin/westos/g' passwd ##替换输出中的games字符到nobody字符之间的nologin为westos 

sed -e 's/nologin/westos/g' -e 's/sbin/lee/g' passwd ##多条替换策略用-e连接 

sed 3d passwd ##不显示文件中的第三行 

sed 3,7d file ##不显示文件中的3-7行 

sed 3,7p file ##重复显示文件中的3-7行

sed -n 3,7p file ##只显示文件中的3-7行

[[email protected] mnt]# cat rule ##规则文件内容

s/nologin/westos/g

s/sbin/lee/g

[[email protected] mnt]# sed -f rule  file ##使用规则文件更改输出

     1 root:x:0:0:root:/root:/bin/bash

     2 bin:x:1:1:bin:/bin:/lee/westos

     3 daemon:x:2:2:daemon:/lee:/lee/westos

     4 adm:x:3:4:adm:/var/adm:/lee/westos

运维学习之脚本命令架构基础

运维学习之脚本命令架构基础

运维学习之脚本命令架构基础

运维学习之脚本命令架构基础

运维学习之脚本命令架构基础

5.变量

1)作用

env查看变量

2)变量的命令规则

首字母不能是数字,变量中只能包含字母数字和下划线

TEST

TEST_REDHAT

Test_Redhat

3)变量设定方式

环境级

在当前环境生效,当前环境关闭,变量失效

export A=1

用户级

只针对配置过的用户生效,其他用户无法使用

vim /root/.bash_profile

export A=1

source /root/.bash_profile

系统级


4)命令别名设定

alias xie='vim'

vim ~/.bashrc

alias xie='vim'


vim /etc/bashrc

alias xie='vim'


unalias xie


5)变量定义方式

USER=root

变量定义测试

运维学习之脚本命令架构基础

运维学习之脚本命令架构基础

6)shell脚本中函数的定义

TEST()

{

echo hello world

}

TEST

7)变量对比

test=[]

eq =

ne !=

gt >

lt <

le <=

ge >=

运维学习之脚本命令架构基础

运维学习之脚本命令架构基础

8)特殊符号转译与注释

''强引用

“”弱引用 其转译功能不能转译“!” “$” "\" "`"

\转译单个字符

运维学习之脚本命令架构基础ping测试运维学习之脚本命令架构基础

运维学习之脚本命令架构基础

脚本内容如下

运维学习之脚本命令架构基础

运维学习之脚本命令架构基础

运维学习之脚本命令架构基础

9)变量的声明

a=1

$ab=空

${a}b=1b

6.四则运算

1.运算法则

++ i++ i=i+1

-- i-- i=i-1

+= j+=i j=j+i

-= j-=i j=j-i

+

-

*

/

**

%

运维学习之脚本命令架构基础2.运算命令

$[ 3+2 ]

let A=3+2

expr 3+2

j=j+i脚本运维学习之脚本命令架构基础

运维学习之脚本命令架构基础

用运算命令计算

运维学习之脚本命令架构基础7.脚本中的常用语句

1.

for

do

done

2.

while

do

done

3.

if

then

elif

then

else

fi

4.

case

5

.expect

10秒倒计时

运维学习之脚本命令架构基础

运维学习之脚本命令架构基础

break和exit的等级对比

运维学习之脚本命令架构基础

运维学习之脚本命令架构基础

运维学习之脚本命令架构基础

运维学习之脚本命令架构基础

1分10秒倒计时

运维学习之脚本命令架构基础

运维学习之脚本命令架构基础

运维学习之脚本命令架构基础

运维学习之脚本命令架构基础

字符反写

运维学习之脚本命令架构基础

运维学习之脚本命令架构基础

文件属性匹配

运维学习之脚本命令架构基础

运维学习之脚本命令架构基础

用用户文件和密码文件进行匹配的方式创建新用户

运维学习之脚本命令架构基础

运维学习之脚本命令架构基础

运维学习之脚本命令架构基础

运维学习之脚本命令架构基础