20.1 Shell脚本介绍
• shell是一种脚本语言 aming_linux blog.lishiming.net
• 可以使用逻辑判断、循环等语法
• 可以自定义函数
• shell是系统命令的集合
• shell脚本可以实现自动化运维,能大大增加我们的运维效率
20.2 Shell脚本结构和执行
• 开头需要加#!/bin/bash
• 以#开头的行作为解释说明
• 脚本的名字以.sh结尾,用于区分这是一个shell脚本
• 执行方法有两种
• chmod +x 1.sh; ./1.sh
• bash 1.sh
• 查看脚本执行过程 bash -x 1.sh
• 查看脚本是否语法错误 bash -n 1.sh
例子:
#!/bin/bash
#2018-05-26
#echo w ls
echo "12345"
w
执行方法:
- 给脚本添加执行权限“chmod a+x 01.sh”,然后直接执行该脚本“./01.sh”
- sh 01.sh (/bin/bash = .bin/sh = bash)
- 绝对路径执行 /root/shell/01.sh ./ 只是相对路径
执行参数
-x:sh -x test.sh 查看显示脚本执行过程
-n:sh -n test.sh 查看脚本是否存在语法错误
20.3 date命令用法
date命令用于显示或设置系统时间与日期。
语法: date [option] 参数
Options:
-d <string>:显示字符串指定的日期与时间(字符串前后必须加上双引号)
-s<string>:根据字符串来设置时间与日期(字符串前后必须加双引号)
参数:
<+时间日期格式>:指定日期和时间显示的格式
常用日期格式:
date +%Y-%m-%d, date +%y-%m-%d 年月日
date +%H:%M:%S = date +%T 时间
date +%s 时间戳
date -d @1504620492
date -d "+1day" 一天后
date -d "-1 day" 一天前
date -d "-1 month" 一月前
date -d "-1 min" 一分钟前
date +%w, date +%W 星期 一年第几个星期
date +%F 带-显示年月日
date +%s -d "2012-07-16 00:00:00" 换算时间戳
说明: 指定某时间或日期的时候,后面要跟对应的时间格式参数
“cal -y”可以查看一年的日历
20.4 Shell脚本中的变量
• 当脚本中使用某个字符串较频繁并且字符串长度很长时就应该使用变量代替
• 使用条件语句时,常使用变量 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]
20.5 Shell脚本中的逻辑判断
格式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
在[ ]中括号中:
-lt:=little than 小于 <
-le:=little && equal 小于等于 <=
-eq:=equal 等于 ==
-ne:=no equal 不等于 !=
-gt:=greater than 大于 >
-ge:=greater && equal 大于等于 >=
可以用用符号,但要在(( ))小括号中:类似: if (($a>1)); then echo ok;fi
ok
<,<=,==,!=,>,>=注意: 使用双括号括起来
格式1:if 条件 ; then 语句; fi
#!/bin/bash
a=5
if [ $a -gt 3 ] #注意[]内的空格
then
echo ok
fi
格式2:if 条件; then 语句; else 语句; fi
#!/bin/bash
a=3
if [ $a -gt 3 ]
then
echo ok
else
echo no ok
fi
格式3:if …; then … ;elif …; then …; else …; fi
#!/bin/bash
a=1
if [ $a -lt 3 ]
then
echo "<3"
elif [ $a -lt 6 ]
then
echo "<6 && >3"
else
echo no ok
fi
关系
各个条件之间的关系可以使用逻辑连接符:
条件A&&条件B:并且
条件A||条件B:或者
• if [ $a -gt 5 ] && [ $a -lt 10 ]; then
• if [ $b -gt 5 ] || [ $b -lt 3 ]; then
20.6 文件目录属性判断
shell脚本中if经常用于判断文档的属性,比如判断是普通文件还是目录文件,判断文件是否有读、写、执行权限等。if常用的选项有以下几个:
- -e:判断文件或目录是否存在
- -d:判断是不是目录文件以及是否存在
- -f:判断是不是普通文件以及是否存在
- -r:判断是否有读权限
- -w:判断是否有写权限
- -x:判断是否有执行权限
格式
[ -f file ]判断是否是普通文件,且存在
#!/bin/nash
f="/tmp/lxy"
if [ -f $f ]
then
echo $f exist
else
touch $f
fi
[ -d file ] 判断是否是目录,且存在
#!/bin/nash
f="/tmp/lxy"
if [ -d $f ]
then
echo $f exist
else
touch $f
fi
[ -e file ] 判断文件或目录是否存在
#!/bin/nash
f="/tmp/lxy"
if [ -e $f ]
then
echo $f exist
else
touch $f
fi
[ -r file ] 判断文件是否可读
#!/bin/nash
f="/tmp/lxy"
if [ -r $f ]
then
echo $f read
fi
[ -w file ] 判断文件是否可写
#!/bin/nash
f="/tmp/lxy"
if [ -w $f ]
then
echo $f read
fi
[ -x file ] 判断文件是否可执行
#!/bin/nash
f="/tmp/lxy"
if [ -x $f ]
then
echo $f read
fi
另外一种用法,判断这个文件或者目录存不存在,如果存在就删除,“&&”表示当前面的命令执行成功的时候才会执行后面的命令 。“||”表示文件不存在才会执行后面的操作
#!/bin/bash
f="/tmp/chamlinux"
[ -f /tmp/chamlinux ] && rm -f $f
如果文件不存在
#!/bin/bash
f="/tmp/chamlinux"
if [ ! -f $f ]
then
touch $f
fi