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