Shell是一个命令解释器,它提供一个向内核发送请求的界面系统级程序。
1、shell入门
脚本格式要求:以#!/bin/bash开头,脚本要有可执行权限。
编写一个shell脚本:
vim hello.sh#!/bin/bash
echo "hello java~"
脚本执行方式:
1)输入脚本的绝对或相对路径,前提要有执行权限
./hello.sh
2)sh +脚本,没有权限也能执行
sh ./hello.sh
2、变量
shell变量分为系统变量和自定义变量,变量名称可以由字母、数字、下划线组成,字母一般大写。
系统变量:$PATH $HOME $PWD $USER $SHELL
显示当前所有变量:set
定义变量:变量名=值(等号不要空格)
撤销变量:unset 变量
声明静态变量:readonly 变量(不可以unset)
#!/bin/bash
A=10
echo "A=$A"
将命令的返回值赋值给变量:A=`date`或A=$(date)
设置环境变量:
export 变量名=变量值 (将shell变量输出为环境变量\全局变量)
source 配置文件
echo $变量名
案例:在/etc/profile中定义TOMCAT_HOME环境变量,查看环境变量的值,在另一个shell程序中使用TOMCAT_HOME
在profile文件中写入:export TOMCAT_HOME=/opt/tomcat
更新环境变量:source /etc/profile
位置参数变量:
在执行脚本时可以传入相应的参数,如:./myshell.sh 100 200
基本语法:
${}
:获取变量的值,{}可省略;$n
:(n代表数字,$0
为命令本身,$1-9
代表第一到第九个参数,10以上用大括号${10}
);$@
:代表所有参数,但区分每个参数;$#
:命令行中参数个数;$*
:代表所有参数,所有参数看为一个整体
预定义变量:
$$:当前进程的进程号
$!:后台运行的最后一个进程的进程号
$?:最后一次执行命令的返回状态,0代表执行成功,非0失败
#!/bin/bash
echo "当前执行进程的id=$$"
#以后台运行一个脚本,并获取它的进程号。
./myshell.sh 100 200 &echo "最后一个执行进程id=$!"
echo "执行结果=$?"
3、shell注释
单行注释:#
多行注释:
:<<!
内容
!
4、运算符
(1)$$((运算式))
(2)$[运算式]
(3)expr表达式(运算符之间要有空格)
+、-、\*、/、%加减乘除取余
expr 5 + 3
注意空格
案例1:计算(2+3)x4
第一种方式res=$(((2+3)*4))
或第二种res=$[(2+3)*4]
或expr
temp=`expr 2 + 3`
res=`$temp \* 4`
echo “$res”
5、条件判断
(1)if语句
单分支:
if [ 条件 ]
then
代码
fi
两个分支:
if [ 条件 ]
then
代码
else
代码
fi
多分支:
if [ 条件 ]
then
代码
elif [ 条件 ]
then
代码
else
代码
fi
(2)条件语句: [ 条件 ] 注意左右空格
例:
[ abc ] 返回true
[ ] 返回false
[ 条件 ] && echo ok || echo !ok 条件满足执行后面语句
判断条件:
1)=字符串比较
2)整数比较
-lt 小于(<)
-le 小于等于(<=)
-eq 等于(==)
-gt 大于(>)
-ge 大于等于(>=)
-ne 不等于(!=)
3)按照文件权限判断
-r 有读权限
-w 有写权限
-x 有执行权限
4)按照文件类型判断
-f 文件存在&普通文件
-e 文件存在
-d 文件存在&为目录
案例:编写一个shell程序,输入一个数,大于大于60及格,小于不及格
#!/bin/bash
if [ $1 -ge 60 ]
then
echo "及格"
elif [ $1 -lt 60 ]
then
echo "不及格"
fi
6、case语句
case expression in
pattern1)
statement1
;;
pattern2)
statement2
;;
pattern3)
statement3
;;
#其他pattern情形
*)
statement
esac
pattern支持正则表达式:
* :表示任意字符串。
[abc]:表示 a、b、c 三个字符中的任意一个。比如,[15ZH] 表示 1、5、Z、H 四个字符中的任意一个。
[m-n]:表示从 m 到 n 的任意一个字符。比如,[0-9] 表示任意一个数字,[0-9a-zA-Z] 表示字母或数字。
| :表示多重选择,类似逻辑运算中的或运算。比如,abc | xyz 表示匹配字符串 “abc” 或者 “xyz”。
expression 既可以是一个变量、一个数字、一个字符串,还可以是一个计算表达式,或者是命令的执行结果,只要能够得到 expression 的值就可以。pattern 可以是一个数字、一个字符串,甚至是一个简单的正则表达式。有时候相近的内容作为一个pattern时,这些内容以“|”隔开,比如 y|yes|YES)。如果 expression 和某个模式匹配成功,就会执行这模式后面对应的所有语句(该语句可以有一条,也可以有多条),直到遇见双分号;;才停止,然后整个 case 语句就执行完了,程序会跳出整个 case 语句,执行 esac 后面的其它语句。如果 expression 没有匹配到任何一个模式,那么就执行*)后面的语句,直到遇见双分号;;或者esac才结束。最后一个分支可以写;;,也可以不写。执行到 esac 都会结束整个 case in 语句。最后一个分支*)并不是什么语法规定,它只是一个正则表达式,*表示任意字符串。
case $1 in
1)
echo “星期一”
;;
2)
echo “星期二”
;;
3)
echo “星期三”
;;
#其他pattern情形
*)
echo “others”
esac
7、循环
for循环
案例一:编写一个num.sh,将输入的数字参数输出
#!/bin/bash
for i in "$@"
do
echo "n is $i"
done
案例二:编写一个sum.sh对1到100求和输出结果
#!/bin/bash
SUM=0
for(( i=1;i<=100;i++ ))
do
$SUM=$[$SUM+Si]
done
echo $SUM
while循环
while [ 条件 ]
do
代码
done
案例:从命令行输入一个参数n,计算1+2+…+n
#!/bin/bashSUM=0
i=1
while [ $i -le $1 ]
do
SUM=$[ $SUM+$i ]
i=$[ $i+1 ]
done
echo $SUM
8、read读取输入
-p : 读取时的提示;-t:读取等待的秒数
案例:读取控制台输入的两个数输出
read -p "请输入一个数=" NUM1
echo $NUM1
read -t 10 -p "请在10秒内输入一个数=" NUM2
echo $NUM2
9、函数
系统函数basename\dirname
basename返回路径后的文件名,dirname返回文件所在文件夹绝对路径
案例1:取出/home/myhome/a.txt的a.txt文件名
basename /home/myhome/a.txt
案例2:取出/home/myhome/a.txt的文件的绝对路径/home/myhome
dirname /home/myhome/a.txt
自定义函数:
function 函数名(){
}
调用函数:函数名+参数值
案例:定义一个函数getSum()求出输入参数之和
#!/bin/bashfunction getSum(){
SUM=$[$n1+$n2]
echo "$SUM"
}
read -p "请输入一个数n1=" n1
read -p "请输入一个数n2=" n2
getSum $n1 $n2
10、备份数据库练习
在/usr/sbin下创建数据库备份脚本文件mysql_db_backup.sh
#!/bin/bashBACKUP=/data/backup/db
#时间DATETIME=$(date +%Y-%m-%d_%H%M%S)
echo $DATETIME
#主机HOST=localhost
#用户DB_USER=root
#密码DB_PASS=root
#数据库名DATABASE=MyDB
#创建备份目录[ ! -d "${BACKUP}/${DATETIME}" ] && mkdir -p "${BACKUP}/${DATETIME}"
#备份mysqldump -u{DB_USER} -p{DB_PASS} --host=${HOST} -q -R --datebases ${DATABASE} | gzip > ${BACKUP}/${DATETIME}/$DATETIME.sql.gz
#打包cd ${BACKUP}
tar -zcvf $DATETIME.tar.gz ${DATETIME}
#删除备份目录rm -rf ${BACKUP}/${DATETIME}
#删除10天前备份数据find ${BACKUP} -atime 10+ -name "\*.tar.gz" -exec rm -rf {} \
echo "备份$DATABASE 成功~"
每天2点半定时备份
crontab -e30 2 * * * /usr/sbin/mysql_db_backup.sh