Day 30 shell 编程

第1章 Shell 编程

1.1 为什么要学习shell编程

Linux 系统批量管理

提升工作效率

减少重复工作

1.2 什么是shell

什么是shell.png

1.2.1 书写脚本

/server/scripts 下新建脚本

#!/bin/bash    #脚本默认使用的命令解释器是谁(脚本开头)

 

#get ip address

ip=`hostname -I|awk '{print $1}'`

#mkdir && backup

mkdir -p /backup/$ip

tar zcf /backup/$ip/etc-`date  +%F`.tar.gz   /etc/

 

第2章 变量  特殊变量

2.1 什么是变量?

x + y = 10    x=20  y=?  未知数(变量)

2.1.1 变量命名规则: 不能以数字开头

ip=10.0.0.200

#赋值(把数据存放在变量中)

[root@oldboyedu50-lnb /server/scripts]# echo $ip

10.0.0.200

[root@oldboyedu50-lnb /server/scripts]# 1ip=10.0.0.200

-bash: 1ip=10.0.0.200: command not found

 

2.1.2 变量分类:

普通变量(局部变量)

环境变量(全局变量)

1.大写

2.系统定义的

3.在大部分地方可以使用

PATH  PS1  LANG

 

2.1.3 #env结果的第1

env |awk -F= '{print $1}'

env |sed 's#=.*##g'

env|egrep '^[A-Z0-9_]+' -o

env|egrep '^[^=]+'

HOSTNAME

TERM

SHELL

HISTSIZE

SSH_CLIENT

SSH_TTY

USER

LS_COLORS

MAIL

PATH

PWD

LANG

HISTCONTROL

SHLVL

HOME

LOGNAME

CVS_RSH

SSH_CONNECTION

LESSOPEN

G_BROKEN_FILENAMES

_

 

2.2 局部变量利用exportOLDBOY变成全局变量

[root@oldboyedu50-lnb /server/scripts]# OLDBOY=10

[root@oldboyedu50-lnb /server/scripts]# echo $OLDBOY

10

[root@oldboyedu50-lnb /server/scripts]# cat show.sh

echo $OLDBOY

[root@oldboyedu50-lnb /server/scripts]# sh show.sh

 

[root@oldboyedu50-lnb /server/scripts]# sh -x  show.sh

+ echo

 

[root@oldboyedu50-lnb /server/scripts]# export OLDBOY=10

[root@oldboyedu50-lnb /server/scripts]# sh -x  show.sh

+ echo 10

10

 

[root@oldboyedu50-lnb /server/scripts]# env |grep -i oldboy

HOSTNAME=oldboyedu50-lnb

OLDBOY=10

 

2.3 全局变量与局部变量区别

局部变量与全局变量的区别.png

source 执行脚本-全局.png

 

[root@oldboyedu50-lnb /server/scripts]# unset OLDBOY        unset全局变为局部

[root@oldboyedu50-lnb /server/scripts]# env  |grep OLDBOY

[root@oldboyedu50-lnb /server/scripts]# OLDBOY=10

[root@oldboyedu50-lnb /server/scripts]# echo $OLDBOY

10

[root@oldboyedu50-lnb /server/scripts]# cat show.sh

echo $OLDBOY

[root@oldboyedu50-lnb /server/scripts]# sh show.sh

[root@oldboyedu50-lnb /server/scripts]# source  show.sh       source 局部变为全局

10

[root@oldboyedu50-lnb /server/scripts]# .   show.sh

10

 

2.4 特殊变量:(重点)

2.4.1 显示6day

[root@oldboyedu50-lnb /server/scripts]# week=6

[root@oldboyedu50-lnb /server/scripts]# echo $week

6

[root@oldboyedu50-lnb /server/scripts]# echo $week’day’

6day

 [root@oldboyedu50-lnb /server/scripts]# echo ${week}day

6day

 

2.4.2 书写一个计算器 加减乘除

#变量中 把两个数字放在变量中

[root@oldboyedu50-lnb /server/scripts]# n1=10

[root@oldboyedu50-lnb /server/scripts]# n2=20

[root@oldboyedu50-lnb /server/scripts]# awk  'BEGIN{print n1/n2}'

awk: fatal: division by zero attempted

 

#命令行中的变量 放在awk中使用

[root@oldboyedu50-lnb /server/scripts]# awk  'BEGIN{print n1,n2}'

 

[root@oldboyedu50-lnb /server/scripts]# awk -vnum1=10  'BEGIN{print num1 }'

10

[root@oldboyedu50-lnb /server/scripts]# awk -vnum1=10  -vnum2=20 'BEGIN{print num1/num2 }'

0.5

 

2.4.3 书写脚本计算1020的加减乘除

cal.sh

#!/bin/bash

n1=10

n2=30

awk -vnum1=$n1  -vnum2=$n2 'BEGIN{print num1+num2 }'

awk -vnum1=$n1  -vnum2=$n2 'BEGIN{print num1-num2 }'

awk -vnum1=$n1  -vnum2=$n2 'BEGIN{print num1*num2 }'

awk -vnum1=$n1  -vnum2=$n2 'BEGIN{print num1/num2 }'

 

2.5 批量删除 Ctrl + v   d

2.5.1 批量增加

2.5.2  进入批量编辑模式(可视块)

2.5.3  选择 批量增加的范围

2.5.4   shift + i 进行修改

2.5.5  esc 退出等等

2.6 特殊变量

$1 $2  $数字  awk:第1 2 3

              shell脚本:1个参数

$0            awk:整行

              shell脚本:文件名

$#            脚本的参数个数   判断脚本的参数个数

$?            上一个命令的执行结果(返回值)

0             执行正确

0           执行失败

 

[root@oldboyedu50-lnb /server/scripts]# cat  cal.sh   查看脚本内容

#!/bin/bash

n1=$1

n2=$2

 

awk -vnum1=$n1  -vnum2=$n2 'BEGIN{print num1+num2 }'

awk -vnum1=$n1  -vnum2=$n2 'BEGIN{print num1-num2 }'

awk -vnum1=$n1  -vnum2=$n2 'BEGIN{print num1*num2 }'

awk -vnum1=$n1  -vnum2=$n2 'BEGIN{print num1/num2 }'

[root@oldboyedu50-lnb /server/scripts]# sh cal.sh 10 20   执行脚本

30

-10

200

0.5

[root@oldboyedu50-lnb /server/scripts]# sh cal.sh 1 3

4

-2

3

0.333333

 

2.6.1 判断上一个命令执行的是否正确

[root@oldboy50-lnb ~]#ls /etc/

[root@oldboy50-lnb ~]#echo $?    0则执行正确,非0则不正确
0
[root@oldboy50-lnb ~]#lsa /etc/
-bash: lsa: command not found
[root@oldboy50-lnb ~]#echo $?
127

 

[root@oldboyedu50-lnb /server/scripts]# cat  cal.sh

#!/bin/bash

n1=$1

n2=$2

awk -vnum1=$n1  -vnum2=$n2 'BEGIN{print num1+num2 }'

awk -vnum1=$n1  -vnum2=$n2 'BEGIN{print num1-num2 }'

awk -vnum1=$n1  -vnum2=$n2 'BEGIN{print num1*num2 }'

awk -vnum1=$n1  -vnum2=$n2 'BEGIN{print num1/num2 }'

 

通过命令行传递参数方式进行计算

sh cal.sh 10 20

 

2.7 通过read 交互式

read交互式赋予变量内容

read -p "提示信息:"  变量名字

read -p "提示信息:"  p

执行之后会把输入的信息存放在变量中

 

[root@oldboyedu50-lnb /server/scripts]# read -p "input num1:" n1

input num1:oldboy

[root@oldboyedu50-lnb /server/scripts]# echo $n1

oldboy

 

[root@oldboyedu50-lnb /server/scripts]# read -s -t 5 -p "input passwd:" p

input passwd:[root@oldboyedu50-lnb /server/scripts]#

 

#cal-read.sh 通过read命令实现 n1 n2赋值

#!/bin/bash

read -p "input num1,num2:" n1 n2

awk -vnum1=$n1  -vnum2=$n2 'BEGIN{print num1+num2 }'

awk -vnum1=$n1  -vnum2=$n2 'BEGIN{print num1-num2 }'

awk -vnum1=$n1  -vnum2=$n2 'BEGIN{print num1*num2 }'

awk -vnum1=$n1  -vnum2=$n2 'BEGIN{print num1/num2 }'

[root@CJY scripts]# sh cal.sh

请输入两个数字

input num1,num2:2 9

11

-7

18

0.222222

 

2.8 判断 if

2.8.1 如果/oldboy 目录存在 显示 /oldboy dir exist

# ls /oldboy/ && echo  dir exist

2.8.2 如果/oldboy 不存在   则创建这个目录

[root@oldboyedu50-lnb /oldboy]# cd /oldboya/  || mkdir -p /oldboya   命令行显示

-bash: cd: /oldboya/: No such file or directory

[root@oldboyedu50-lnb /oldboy]# ll -d /oldboya/

drwxr-xr-x 2 root root 4096 Aug 17 12:16 /oldboya/

脚本显示

a='/oldboy'

if [ -d $a ];then

 echo "/oldboy 目录存在"

else

 echo "/oldboy 不存在"

fi

"cal.sh" 27L, 661C written                                                                                        

[root@CJY scripts]# sh cal.sh

/oldboy 目录存在

 

2.8.3 条件表达式:

#判断文件 目录 是否存在

[ -d /oldboy ]

[ -f /oldboy ]

 

2.9 #比大小

-eq         equal        ==

-ne     not equal         !=

-gt     great than         >

-ge     great equal        >=

-lt     less  than         <

-le     less  equal        <=

 

[root@oldboyedu50-lnb /oldboy]# [ 10 -eq 10 ]

[root@oldboyedu50-lnb /oldboy]# echo $?

0

[root@oldboyedu50-lnb /oldboy]# [ 10 -gt 10 ]

[root@oldboyedu50-lnb /oldboy]# echo $?

1

[root@oldboyedu50-lnb /oldboy]# [ 10 -ge 10 ]

[root@oldboyedu50-lnb /oldboy]# echo $?

0

 

[root@oldboyedu50-lnb /oldboy]# [ -d /oldboy ]

[root@oldboyedu50-lnb /oldboy]# echo $?

0

[root@oldboyedu50-lnb /oldboy]# [ -d /oldboyaaa ]

[root@oldboyedu50-lnb /oldboy]# echo $?

1

 

if判断 ******

if [ 条件 ];then

   命令

fi

 

2.9.1 判断脚本的参数个数,如果不是2则提示请输入两个数字

[root@oldboyedu50-lnb /server/scripts]# cat pan.sh

#!/bin/bash

if [ $# -ne 2 ];then

   echo "输入两个数字"

fi

 

2.9.2 给计算器增加一个条件 判断脚本的参数个数,如果不是2则提示请输入两个数字

 [root@oldboyedu50-lnb /server/scripts]# cat cal.sh

#!/bin/bash

n1=$1

n2=$2

if [ $# -ne 2 ];then

   echo "USAGE: $0 num1 num2"

   exit

fi

awk -vnum1=$n1  -vnum2=$n2 'BEGIN{print num1+num2 }'

awk -vnum1=$n1  -vnum2=$n2 'BEGIN{print num1-num2 }'

awk -vnum1=$n1  -vnum2=$n2 'BEGIN{print num1*num2 }'

awk -vnum1=$n1  -vnum2=$n2 'BEGIN{print num1/num2 }'

[root@oldboyedu50-lnb /server/scripts]# sh  cal.sh

USAGE: cal.sh num1 num2

[root@oldboyedu50-lnb /server/scripts]# sh  cal.sh 120 20

140

100

2400

6

 

2.9.3 comp.sh输入两个数字:

1.如果n1大于n2

n1 > n2

2.如果n1不大于n2

n1 <= n2

[root@oldboyedu50-lnb /server/scripts]# cat  comp.sh

#!/bin/bash

n1=$1

n2=$2

if [ $n1 -gt $n2 ];then

   echo "$n1 > $n2"

else

   echo "$n1 <= $n2"

fi

[root@oldboyedu50-lnb /server/scripts]# sh comp.sh 10 20

10 <= 20

[root@oldboyedu50-lnb /server/scripts]# sh comp.sh 10 10

10 <= 10

[root@oldboyedu50-lnb /server/scripts]# sh comp.sh 100 10

100 > 10

 

[root@oldboyedu50-lnb /server/scripts]# cat  comp-multi.sh

#!/bin/bash

n1=$1

n2=$2

if [ $n1 -gt $n2 ];then

   echo "$n1 > $n2"

elif [ $n1 -lt $n2 ];then

   echo "$n1 <$n2"

else

   echo "$n1 == $n2"

fi

[root@oldboyedu50-lnb /server/scripts]# sh  comp-multi.sh 19 29

19 <29

 

3.for 循环

for 变量  in  列表

do

    命令

done

 

for tao  in  girl{01..9999} 

do

    echo $tao

done