新的学习任务:
20.1 shell脚本介绍
20.2 shell脚本结构和执行
20.3 date命令用法
20.4 shell脚本中的变量
20.5 shell脚本中的逻辑判断
20.6 文件目录属性判断
20.7 if特殊用法
20.8/20.9 case判断
20.10 for循环
20.11/20.12 while循环
20.13 break跳出循环
20.14 continue结束本次循环
20.15 exit退出整个脚本
扩展
select用法 http://www.apelearn.com/bbs/thread-7950-1-1.html
shell脚本结构
shell脚本执行方式
sh的参数
sh -x 1.sh 可以查看脚本执行过程
sh -n 1.sh 可以查看脚本中的语法错误,命令是否错误无法检查
命令格式 | 含义 |
---|---|
date | 日期格式:2019年 06月 14日 星期五 21:04:56 CST |
date +%Y | 年 |
date +%m | 月 |
date +%d | 日 |
date +%H | 小时 |
date +%M | 分钟 |
date +%S | 秒 |
date +%w | 星期几 |
date +%F | 日期格式:2019-06-14 |
date +%s | 时间戳 |
date +%T | 时间:21:05:52 |
date “+%Y-%m-%d %H:%M:%S %w” | 2019-06-14 21:07:22 5 |
date +%Y%m%d -d ‘-1 day’ | 前一天的时间 |
date +%H:%M:%S -d ‘-1 hour’ | 前一分钟 |
[root@linux-01 ~]# date
2019年 06月 15日 星期六 10:56:07 CST
[root@linux-01 ~]# date +%Y
2019
[root@linux-01 ~]# date +%m
06
[root@linux-01 ~]# date +%d
15
[root@linux-01 ~]# date +%F
2019-06-15
[root@linux-01 ~]# date +%H
11
[root@linux-01 ~]# date +%M
02
[root@linux-01 ~]# date +%S
03
[root@linux-01 ~]# date +%T
11:03:11
[root@linux-01 ~]# date +"%F %T"
2019-06-15 11:03:48
## -d 选项用法 ##
[root@linux-01 ~]# date -d "-1 day" +%F
2019-06-14
[root@linux-01 ~]# date -d "-1 day" +"%F %T"
2019-06-14 11:05:31
[root@linux-01 shell]# date -d "-1 year" +%F
2018-06-15
[root@linux-01 shell]# date -d "-1 hour" +%T
20:36:43
当脚本中使用某个字符串较频繁并且字符串长度很长时就应该使用变量代替(比如a=jdjjdjdddx)
使用条件语句时,常使用变量 if [ $a -gt 1 ]; then … ; fi
引用某个命令的结果时,用变量替代 n=wc -l 1.txt
写和用户交互的脚本时,变量也是必不可少的 read -p "Input a number: " n; echo $n 如果没写这个n,可以直接使用$REPLY
内置变量 $0, $1, $2… $0表示脚本本身,$1 第一个参数,$2 第二个 … $#表示参数个数
数学运算a=1;b=2; c=$(($a+$b))或者$[$a+$b]
[root@linux-01 shell]# vim 1.sh
#!/bin/bash
a=6
if [ $a -gt 5 ] ;
then
echo "变量a>5"
fi
[root@linux-01 shell]# sh 1.sh
变量a>5
[root@linux-01 shell]# sh -x 1.sh
+ a=6
+ '[' 6 -gt 5 ']'
+ echo '变量a>5'
变量a>5
[root@linux-01 shell]# vim 2.sh
#!/bin/bash
read -p "Input a number: " a
if [ $a -gt 5 ] ;
then
echo "变量a>5"
fi
[root@linux-01 shell]# sh 2.sh
Input a number: 12
变量a>5
if命令的格式:
格式1:if 条件 ; then 语句; fi
格式2:if 条件; then 语句; else 语句; fi
格式3:if …; then … ;elif …; then …; else …; fi
逻辑判断表达式:if [ $a -gt $b ]; if [ $a -lt 5 ]; if [ $b -eq 10 ]等 -gt (>); -lt(<); -ge(>=); -le(<=);-eq(==); -ne(!=) 注意表示是中左右都是空格
逻辑判断可以使用 && || 结合多个条件:if [ $a -gt 5 ] && [ $a -lt 10 ]; then或者if [ $b -gt 5 ] || [ $b -lt 3 ]; then
[ -f file ]判断是否是普通文件,且存在
[ -d file ] 判断是否是目录,且存在
[ -e file ] 判断文件或目录是否存在
[ -r file ] 判断文件是否可读
[ -w file ] 判断文件是否可写
[ -x file ] 判断文件是否可执行
## 判断文件是否存在##
[root@linux-01 shell]# ls
1.sh 2.sh
[root@linux-01 shell]# vim 3.sh
#!/bin/bash
a='/root/shell/look.txt'
if [ -f $a ];
then
echo "look.txt 存在。"
else
touch $a
echo "look.txt 已经创建。"
fi
[root@linux-01 shell]# sh 3.sh
look.txt 已经创建。
[root@linux-01 shell]# sh -x 3.sh
+ a=/root/shell/look.txt
+ '[' -f /root/shell/look.txt ']'
+ echo 'look.txt 存在。'
look.txt 存在。
[root@linux-01 shell]#
## 判断一个文件夹是否存在 ##
[root@linux-01 shell]# vim 4.sh
#!/bin/bash
a='/root/shell/xihaji'
if [ -d $a ];
then
echo "xihaji文件夹存在。"
else
mkdir $a
echo "xihaji文件夹已经创建。"
fi
[root@linux-01 shell]# sh -x 4.sh
+ a=/root/shell/xihaji
+ '[' -d /root/shell/xihaji ']'
+ mkdir /root/shell/xihaji
+ echo xihaji文件夹已经创建。
xihaji文件夹已经创建。
[root@linux-01 shell]# ll
总用量 16
-rw-r--r--. 1 root root 64 6月 15 11:10 1.sh
-rw-r--r--. 1 root root 89 6月 15 11:16 2.sh
-rw-r--r--. 1 root root 146 6月 15 21:40 3.sh
-rw-r--r--. 1 root root 156 6月 15 21:52 4.sh
-rw-r--r--. 1 root root 0 6月 15 21:40 look.txt
drwxr-xr-x. 2 root root 6 6月 15 21:52 xihaji
[root@linux-01 shell]#
if特殊用法
if [ -z “$a” ] 逻辑条件是:变量a的值为空
if [ -n “$a” ] 逻辑条件是:变量a的值不为空
if grep -q ‘123’ 1.txt; then 逻辑条件是:1.txt中含有’123’的行
if [ ! -e file ]; then 逻辑条件是:文件不存在
圆括号与方括号的区别:
if (($a<1)); then … 等同于 if [ $a -lt 1 ]; then…
[ ] 中不能使用<,>,==,!=,>=,<=这样的符号
常见的一些用法注意:
if -z或者if -n 都不能作用在文件上,只能作用在变量上。
if [ -z “$a” ] 这个表示当变量a的值为空时会怎么样
! -z=-n
! -n=-z
case 格式
case 变量名 in
value1)
command
;;
value2)
command
;;
value3 | value4) //在case程序中,可以在条件中使用 |,表示或的意思,
command
;;
*)
commond
;;
esac
[root@linux-01 shell]# vim case.sh
#!/bin/bash
read -p "Please input a number: " n
if [ -z "$n" ]
then
echo "Please input a number."
exit 1
fi
n1=`echo $n|sed 's/[0-9]//g'`
if [ -n "$n1" ]
then
echo "Please just input a number, without any other words."
exit 1
fi
if [ $n -lt 60 ] && [ $n -ge 0 ]
then
tag=1
elif [ $n -ge 60 ] && [ $n -lt 80 ]
then
tag=2
elif [ $n -ge 80 ] && [ $n -lt 90 ]
then
tag=3
elif [ $n -ge 90 ] && [ $n -le 100 ]
then
tag=4
else
tag=0
fi
case $tag in
1)
echo "you didn't pass the exam!"
;;
2)
echo "good!"
;;
3)
echo "very good!"
;;
4)
echo "perfect!!!"
;;
*)
echo "Pls input a number range 0-100."
;;
esac
[root@linux-01 shell]# sh -x case.sh
+ read -p 'Please input a number: ' n
Please input a number: 78
+ '[' -z 78 ']'
++ echo 78
++ sed 's/[0-9]//g'
+ n1=
+ '[' -n '' ']'
+ '[' 78 -lt 60 ']'
+ '[' 78 -ge 60 ']'
+ '[' 78 -lt 80 ']'
+ tag=2
+ case $tag in
+ echo 'good!'
good!
[root@linux-01 shell]# !vim
vim for1.sh
#!/bin/bash
sum=0
for i in `seq 1 20`;
do
echo $sum + $i
sum=$[$sum+$i]
echo $sum
done
echo $sum
[root@linux-01 shell]# sh -x for1.sh
+ sum=0
++ seq 1 20
+ for i in '`seq 1 20`'
+ echo 0 + 1
0 + 1
+ sum=1
+ echo 1
1
+ for i in '`seq 1 20`'
+ echo 1 + 2
1 + 2
+ sum=3
+ echo 3
3
+ for i in '`seq 1 20`'
+ echo 3 + 3
3 + 3
+ sum=6
+ echo 6
6
+ for i in '`seq 1 20`'
+ echo 6 + 4
6 + 4
+ sum=10
+ echo 10
10
+ for i in '`seq 1 20`'
+ echo 10 + 5
10 + 5
+ sum=15
+ echo 15
15
+ for i in '`seq 1 20`'
+ echo 15 + 6
15 + 6
+ sum=21
+ echo 21
21
+ for i in '`seq 1 20`'
+ echo 21 + 7
21 + 7
+ sum=28
+ echo 28
28
+ for i in '`seq 1 20`'
+ echo 28 + 8
28 + 8
+ sum=36
+ echo 36
36
+ for i in '`seq 1 20`'
+ echo 36 + 9
36 + 9
+ sum=45
+ echo 45
45
+ for i in '`seq 1 20`'
+ echo 45 + 10
45 + 10
+ sum=55
+ echo 55
55
+ for i in '`seq 1 20`'
+ echo 55 + 11
55 + 11
+ sum=66
+ echo 66
66
+ for i in '`seq 1 20`'
+ echo 66 + 12
66 + 12
+ sum=78
+ echo 78
78
+ for i in '`seq 1 20`'
+ echo 78 + 13
78 + 13
+ sum=91
+ echo 91
91
+ for i in '`seq 1 20`'
+ echo 91 + 14
91 + 14
+ sum=105
+ echo 105
105
+ for i in '`seq 1 20`'
+ echo 105 + 15
105 + 15
+ sum=120
+ echo 120
120
+ for i in '`seq 1 20`'
+ echo 120 + 16
120 + 16
+ sum=136
+ echo 136
136
+ for i in '`seq 1 20`'
+ echo 136 + 17
136 + 17
+ sum=153
+ echo 153
153
+ for i in '`seq 1 20`'
+ echo 153 + 18
153 + 18
+ sum=171
+ echo 171
171
+ for i in '`seq 1 20`'
+ echo 171 + 19
171 + 19
+ sum=190
+ echo 190
190
+ for i in '`seq 1 20`'
+ echo 190 + 20
190 + 20
+ sum=210
+ echo 210
210
+ echo 210
210
[root@linux-01 shell]# vim for2.sh
#!/bin/bash
cd /etc/
for a in `ls /etc/` ;
do
if [ -d $a ] ;
then
echo $a
ls $a
fi
done
每隔1分钟检查一下系统负载,当系统的负载大于10的时候,发一封邮件(监控脚本) 最小单元是任务计划 cron
[root@linux-01 shell]# vim while.sh
#!/bin/bash
while true //true 1 : 都代表真
do
load=`w|head -1|awk -F 'load average: ' '{print $2}'|cut -d. -f1`
if [ $load -gt 10 ]
then
/usr/local/sbin/mail.py [email protected] 1oad "high" "$load"
fi
sleep 30
done
[root@linux-01 shell]# sh -x while.sh
+ true
++ head -1
++ cut -d. -f1
++ awk -F 'load average: ' '{print $2}'
++ w
+ load=0
+ '[' 0 -gt 10 ']'
+ sleep 30
在循环过程过,需要用户输入一个数字;输入的不是数字,是数字,输入为空;回应相应的结果
[root@linux-01 shell]# vim while02.sh
#!/bin/bash
while :
do
read -p "Please input a number: " n
if [ -z "$n" ]
then
echo "you need input sth."
continue
fi
n1=`echo $n|sed 's/[0-9]//g'`
if [ -n "$n1" ]
then
echo "you just only input numbers."
continue
fi
break
done
echo $n
[root@linux-01 shell]# sh -x while02.sh
+ :
+ read -p 'Please input a number: ' n
Please input a number: 123
+ '[' -z 123 ']'
++ echo 123
++ sed 's/[0-9]//g'
+ n1=
+ '[' -n '' ']'
+ break
+ echo 123
123
break 常用于循环语句中,跳出整个循环语句,直接结束所有循环。
[root@linux-01 shell]# cat break.sh
#!/bin/bash
for i in `seq 1 5`
do
echo A=$i
if [ $i -eq 3 ]
#比较数字,用-eq ;若是比较的是字符串,那需要用 ==
then
break
fi
echo B=$i
done
echo C=$i
[root@linux-01 shell]# sh break.sh
A=1
B=1
A=2
B=2
A=3
C=3
[root@linux-01 shell]# sh -x break.sh
++ seq 1 5
+ for i in '`seq 1 5`'
+ echo A=1
A=1
+ '[' 1 -eq 3 ']'
+ echo B=1
B=1
+ for i in '`seq 1 5`'
+ echo A=2
A=2
+ '[' 2 -eq 3 ']'
+ echo B=2
B=2
+ for i in '`seq 1 5`'
+ echo A=3
A=3
+ '[' 3 -eq 3 ']'
+ break
+ echo C=3
C=3
忽略continue之下循环的代码,直接进行下一次循环
[root@linux-01 shell]# vim continue.sh
#!/bin/bash
for i in `seq 1 5`
do
echo A=$i
if [ $i -eq 3 ]
#比较数字,用-eq ;若是比较的是字符串,那需要用 ==
then
continue
fi
echo B=$i
done
echo C=$i
[root@linux-01 shell]# sh -x continue.sh
++ seq 1 5
+ for i in '`seq 1 5`'
+ echo A=1
A=1
+ '[' 1 -eq 3 ']'
+ echo B=1
B=1
+ for i in '`seq 1 5`'
+ echo A=2
A=2
+ '[' 2 -eq 3 ']'
+ echo B=2
B=2
+ for i in '`seq 1 5`'
+ echo A=3
A=3
+ '[' 3 -eq 3 ']'
+ continue
+ for i in '`seq 1 5`'
+ echo A=4
A=4
+ '[' 4 -eq 3 ']'
+ echo B=4
B=4
+ for i in '`seq 1 5`'
+ echo A=5
A=5
+ '[' 5 -eq 3 ']'
+ echo B=5
B=5
+ echo C=5
C=5
[root@linux-01 shell]# sh continue.sh
A=1
B=1
A=2
B=2
A=3
A=4
B=4
A=5
B=5
C=5
[root@linux-01 shell]# sh break.sh
A=1
B=1
A=2
B=2
A=3
C=3
[root@linux-01 shell]#
exit可以定义退出的数值,可以用于确定脚本运行到什么地方的时候,结束
[root@linux-01 shell]# vim exit.sh
#!/bin/bash
for i in `seq 1 5`
do
echo A=$i
if [ $i -eq 3 ]
#比较数字,用-eq ;若是比较的是字符串,那需要用 ==
then
exit
fi
echo B=$i
done
echo C=$i
[root@linux-01 shell]# sh exit.sh
A=1
B=1
A=2
B=2
A=3
[root@linux-01 shell]# sh break.sh
A=1
B=1
A=2
B=2
A=3
C=3
[root@linux-01 shell]# sh continue.sh
A=1
B=1
A=2
B=2
A=3
A=4
B=4
A=5
B=5
C=5
select也是循环的一种,它比较适合用在用户选择的情况下。
比如,我们有一个这样的需求,运行脚本后,让用户去选择数字,选择1,会运行w命令,选择2运行top命令,选择3运行free命令,选择4退出。脚本这样实现:
[root@linux-01 shell]# vim select.sh
#!/bin/bash
echo "Please chose a number, 1: run w, 2: run top, 3: run free, 4: quit"
echo
select command in w top free quit
do
case $command in
w)
w
;;
top)
top
;;
free)
free
;;
quit)
exit
;;
*)
echo "Please input a number:(1-4)."
;;
esac
done
[root@linux-01 shell]# sh select.sh
Please chose a number, 1: run w, 2: run top, 3: run free, 4: quit
1) w
2) top
3) free
4) quit
#?
我们发现,select会默认把序号对应的命令列出来,每次输入一个数字,则会执行相应的命令,命令执行完后并不会退出脚本。它还会继续让我们再次输如序号。序号前面的提示符,我们也是可以修改的,利用变量PS3即可,再次修改脚本如下:
[root@linux-01 shell]# vim select.sh
#!/bin/bash
PS3="Please select a number: "
echo "Please chose a number, 1: run w, 2: run top, 3: run free, 4: quit"
echo
select command in w top free quit
do
case $command in
w)
w
;;
top)
top
;;
free)
free
;;
quit)
exit
;;
*)
echo "Please input a number:(1-4)."
esac
done
[root@linux-01 shell]# sh select.sh
Please chose a number, 1: run w, 2: run top, 3: run free, 4: quit
1) w
2) top
3) free
4) quit
Please select a number: