第1章 shell编程基础

1.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/

1.2  变量

1.2.1 什么是变量?

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

1.2.2 变量命名规则:

不能以数字开头

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

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

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

10.0.0.200

1.3 变量分类:

1.3.1 普通变量(局部变量)

1.3.2 环境变量(全局变量)

1.大写

2.系统定义的

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

PATH  PS1  LANG

实例1-1              env结果的第1

awk

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

sed

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

grep

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

env|egrep '^[^=]+'

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

spacer.gif

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

[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

10

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

10

1.5 特殊变量:(重点)

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

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

6

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

6day

实例1-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

实例1-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 }'

1.5.2 vim批量操作

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

2.选择 批量增加的范围

3. shift + i 进行修改

4.esc 退出等等

1.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

实例1-4              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 }'

 

 

 

 

 

1.7 判断 if

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

# ls /oldboy/ && echo  dir exist

1.7.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/

实例1-5              判断文件目录是否存在

[root@oldboyedu50-lnb /oldboy]# [ -d /oldboy ] && echo dir exist

dir exist

[root@oldboyedu50-lnb /oldboy]# [ -d /oldboy ] || mkdir -p /oldboy

条件表达式:

-eq         equal         ==

-ne     not equal         !=

-gt     great than        >

-ge     great equal       >=

-lt     less  than        <

-le     less  equal       <=

1.7.3 命令是否执行正确

[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

实例1-6              判断脚本的参数个数,如果不是2则提示请输入两个数字

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

#!/bin/bash

if [ $# -ne 2 ];then

   echo "输入两个数字"

fi

实例1-7            给计算器(参数传递)增加一个条件,判断脚本的参数个数,如果不是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

实例1-8              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