您的位置:首页 > 运维架构 > Shell

Day 30 shell 编程

2018-08-17 18:15 711 查看
Day 30 shell 编程

第1章 Shell 编程

1.1 为什么要学习shell编程

Linux 系统批量管理提升工作效率减少重复工作懒

1.2 什么是shell


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 局部变量利用export让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]# 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 全局变量与局部变量区别





[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 书写脚本计算10与20的加减乘除

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Day 30 shell