shell是一种脚本语言,可以使用逻辑判断,循环等语法,可以自定义函数,shell是系统命令的集合,shell脚本可以实现自动化运维,能大大增加我们的运维效率。
一、shell脚本结构和执行方法
1、开头需要加#!/bin/bash以#开头的行作为解释说明
2、脚本的名字以.sh结尾,用于区分这是一个shell脚本
3、执行方法:./1.sh bash 1.sh sh 1.sh
4、查看脚本执行过程bash -x 1.sh
5、查看脚本是否有语法错误 bash -n 1.sh
二、date命令的用法
1、date +%Y-%m-%d时间显示为年月日
2、date +%H:%M:%S=date +%T
3、date +%s时间戳
4、date -d @1504620492把时间戳转换成具体日期
5、date -d “+1day”一天后
6、date -d “-1day”一天前
7、date -d “-1month”一月前
8、date -d “-1min”一分钟前
9、date +%w,显示本周是周几,date +%W显示本年第多少周
三、shell脚本中的变量
1、当脚本中使用某个字符串较频繁并且字符串长度很长的时候就可以使用变量代替。
2、使用条件语句时,使用变量if [ $a -gt 1 ];then....;fi
3、引用某个命令的结果时,用变量代替n=`wc -l 1.txt`
4、写和用户交互的脚本时,可以用到read -p “Input a number:”n;echo $n如果没有写n可以直接使用$REPLY
#!/bin/bash
read -p "please input a command: "
echo $REPLY
echo "is ok"
sleep 3
$REPLY
-p | 指定要显示的提示 |
-s | 静默输入,一般用于密码 |
-n# | 指定输入的字符长度最大值# |
-d ‘字符’ | 输入结束符,当你输入的内容出现这个字符时立即结束 |
-t N | 超出N秒没有进行输入,则自动退出 |
四、shell中的逻辑判断
1、格式1:if条件;then...;fi
2、格式2:if条件;then...;else...;fi
3、格式3:if...;then...;elif...;then...;else...;fi
4、逻辑判断表达式:if [ $a -gt $b ];
5、可以使用&&,和||结合多个条件
if [ $a -gt 5 ] && [ $a -lt 10 ];then...;fi
if [ $b -gt5 ] || [ $b -lt 10 ];then...;fi
#!/bin/bash
echo -n "Please input a: "
read a
echo -n "Please input b: "
read b
if [ $a -lt 20 ] && [ $b -gt 30 ];
then
echo "hello world"
elif [ $a -lt 20 ] || [ $b -gt 30 ];
then
echo "no hello world"
else
echo "is wrong"
fi
五、if判断文件,目录属性
1、if [ -f file ]判断是否为普通文件且存在
2、if [ -d file ]判断是否为目录文件且存在
3、if [ -e file ]判断文件或者目录是否存在
4、if [ -r file ]判断文件是否可读
5、if [ -w file ]判断文件是否可写
6、if [ -x file ]判断文件是否可执行
#!/bin/bash
if [ -f /etc/passwd ]
then
echo `cat /etc/passwd`
fi
六、if判断的一些特殊 用法
1、if [ -z “$a” ]判断变量a为空时要执行什么
2、if [ -n “$a” ]判断变量a不为空时要执行什么
3、if grep -q ‘123’ 1.txt;then...;fi判断如果1.txt中含有’123’的行时执行什么
4、if [ !-e file ];then...;fi判断文件不存在时执行什么
5、if (($a<1));then...;fi等同于if [ $a -lt 1 ];then...fi
6、[ ] 中不能使用<,>,==,>=,!=,<=这样的符号
#!/bin/bash
echo -n "Please enter your age : "
read age
echo -n "Please enter your sex : "
read sex
if [ -z $age ] || [ $age = "" ]
then
echo "is wrong"
elif [ $age -lt 18 ] && [ $sex = "male" ]
then
echo "Hello Boy"
elif [ $age -lt 18 ] && [ $sex = "female" ]
then
echo "Hello Girl"
elif [ $age -gt 18 ] && [ $sex = "male" ]
then
echo "Hello Man"
elif [ $age -gt 18 ] && [ $sex = "female" ]
then
echo "Hello Woman"
else
echo "is wrong"
fi
七、shell中的case判断
1、格式case 变量名in
value1)
command
;;
esac
2、可以使用|表示或的意思
value1|value2)
command
;;
#!/bin/bash
echo "*cmd meau** 1-date 2-ls 3-who 4-pwd"
echo -n "please input a number 1-4: "
read n
case $n in
1)
echo "the date is "
date
;;
2)
echo "there are "
ls
;;
3)
echo "my name is "
who
;;
4)
echo " there is"
pwd
;;
*)
echo "please input a number : 1-4 "
;;
esac
八、for循环
语法:for 变量名 in 条件;do...;done
九、备份数据库Discuz
在本地服务器保存一份数据,然后拷贝远程一份,本地数据保存一周,远程保存一个月,加入到cron中,每天凌晨3点执行
#!/bin/bash
bakdir=/bak/mysql
echo "-------------------The backup is going---------------------"
sleep 5
echo "mysql backup begin at `date +%F-%H:%M:%S` ">>$bakdir/bak.log
d=` date +%F-%H:%M:%S `
mysqldump -uroot -poracle -B --default-character-set=gbk Discuz>/bak/mysql/$d.sql
rsync -av /bak/mysql/$d.sql wyuu:/bak/mysql/
find /bak/mysql/ -mtime +7 -type f -name *.sql|xargs rm -rf
echo "mysql backup end at `date +%F-%H:%M:%S` ">>$bakdir/bak.log
ssh wyuu <<EOF
find /bak/mysql/ -mtime +30 -type f -name *.sql|xargs rm -rf
exit
EOF
sleep 5
echo "---------------------it is over,thanks---------------------"
echo "BYE BYE!"
十、批量创建用户并设置密码
#!/bin/bash
for i in `seq 1 9`
do
useradd user_0$i
ps=`mkpasswd -s 0 -l 10`
passwd $ps
echo "user_0$i passwd is $ps">>/home/user.log
done