shell编程
shell是什么
应用程序调用shell,shell命令解释器驱动内核,内核操作硬件。
shell脚本的执行方式
1)脚本的格式
#!/bin/bash 告诉系统使用哪一种shell进行解析
2)脚本需要有可执行权限
实例
vim myshell.sh
i
!#/bin/bash
echo “hello world”
wq
方式一
chmod 744 myshell.sh 给所有者一个x权限
两种方式
相对路径./myshell.sh
绝对路径./root/shell/myshell.sh
方式二
不用赋予脚本x权限
sh ./myshell.sh 用sh解释器执行脚本
sh /root/shell/myshell.sh
shell变量
1)分为系统变量和用户自定义变量
2)系统变量 $HOME $PWD $SHELL $USER
3)显示系统中所有的变量 set
shell变量的定义
定义变量:变量=值
撤销变量: unset 变量
声明静态变量: readonly 变量 不能unset
案例1定义变量A
A=100
echo “A=$A”
案例2撤销变量A
unset
echo “A=$A”
案例3声明静态变量B=2,不能unset
readonly A=99 定义和使用静态变量
echo “A=$A”
unset A 不可以unset一个静态变量
echo “A=$A”
变量定义的规则
1)变量名称可以有字母数字下划线组成,不能以数字开头
2)等号两侧不能有空格
将命令的返回值给变量
1 A=`ls -la`反引号,运行里面的命令,并把结果返回变量A
RESULT=`ls -l /home`
echo $RESULT
2 A=$(ls -la)等价于反引号``
MYDATE=
(
d
a
t
e
)
e
c
h
o
"
d
a
t
e
=
(date) echo "date=
(date)echo"date=MYDATE"
设置环境变量
基本语法
export 变量名=变量值 设置环境变量
source 配置文件 让修改的配置信息立即生效
echo $环境变量 查询环境变量的值
/etc/profile 环境变量 $TOMCAT_HOME 脚本就可以引用
为了让/etc/profile的环境变量生效,需要使用指令source /etc/profile或者重启系统或者注销用户
实例
1在/etc/profile文件中定义TOMCAT_HOME环境变量
vim /etc/profile
#定义一个环境变量
TOMCAT_HOME=/opt/tomcat
export TOMCAT_HOME
2让修改的配置文件立即生效
source /etc/profile 让其生效
echo $TOMCAT_HOME 有值
:<<! xxxxxxxxx!多行注释
3在另外一个shell程序中使用TOMCAT_HOME
echo “tomcathome=$TOMCAT_HOME”
位置参数变量
介绍
当我们执行一个shell脚本时,希望获取到命令行的参数信息,使用未知参数变量,eg ./myshell.sh 100 300 这就是一个shell的命令行,可以在myshell脚本中获取到参数信息。
基本语法
$n 功能描述:0代表命令本身, 1-9一至第九个参数,10以上用{10}括起来
$* 功能描述:命令行中的所有参数,把所有参数看成一个整体
$@ 功能描述:命令行中的所有参数 每个参数区分对待
$# 功能描述:命令行中参数的个数
案例
vim postionPara.sh
#!/bin/bash
#获取到各个参数
echo “$0 $1 $2” 显示./postionPara.sh 30 60
echo “$*” 显示30 60
echo “$@” 显示30 60
echo “参数个数=$#” 显示2
chmod 544 postionPara.sh
./postionPara.sh 30 60
预定义变量
介绍
事先已近定义好的变量,可以在shell中直接使用
基本语法
$$ 来获取当前的进程号PID
$! 后台运行的最后一个进程的进程号(PID)
$? 最后一个执行的命令的返回状态,0成功,非0,执行不正确
案例
vim preVar.sh
#!/bin/bash
echo “当前的进程号=$KaTeX parse error: Expected 'EOF', got '#' at position 3: " #̲以后台的方式运行shell.s…!”
echo “执行的值=$?”
chmod 744 preVar.sh
./preVar.sh
运算符
基本语法
1)$((运算式)) $[运算式]
2)expr m + n 运算符要有空格
3)expr m - n
4)expr\ *,/,% 乘 除 取余
案例1
vim demo.sh
#!/bin/bash
#第一种方式$((运算式))
RESULT1=$(((2+3)*4))
echo “result1=$RESULT1”
chmod 744 demo.sh
./demo.sh
#第二种方式$[运算式]
RESULT2=$[(2+3)*4]
echo “result2=$RESULT2”
#第三种方式expr
TEMP=`expr 2 + 3`
RESULT3=`expr $TEMP \ * 4` 注意空格
echo “result3=$RESULT3”
案例2
请求出命令行的两个参数[整数]的和
#求出两个参数的和
SUM=$[$1+$2]
echo “SUM=$SUM”
条件判断
基本语法
[ condition ] 注意condition前后要有空格
非空返回true
常用判断条件
1两个整数的比较
=字符串比较
-lt 小于
-le 小于等于
-eq 等于
-gt 大于
-ge 大于等于
-ne 不等于
2按照文件权限进行判断
-r 有读权限 [-r 文件]
-w 有写权限
-x 有执行权限
3按照文件类型进行判断
-f 文件存在并且是一个常规的文件
-e 文件存在
-d 文件存在并是一个目录
应用实例1
“ok"是否等于"ok”
vim judge.sh
#!/bin/bash
if [ “ok” = “ok” ]
then
echo “equal”
fi
chmod 744 judge.sh
./judge.sh
应用实例2
23是否大于等于22
if [ 23 -gt 22 ]
then
echo “大于”
fi
案例三
/root/shell/aaa.txt目录中的文件是否存在
if [ -e /root/shell/aaa.txt ]
then
echo “存在”
fi
流程控制
if 判断
基本语法
if [ 条件判断式 ];then
程序
fi
或者
if [ 条件判断式 ]
then
程序
elif [ 条件判断式 ]
then
程序
fi
注意:(1)[ 条件判断式 ],中括号和条件判断式之间必须有空格
(2)第二种方式常用
案例
编写一个shell程序,如果输入的参数,大于等于60,则输出"及格了",如果小于60,则输出不及格。
vim teshif
#!/bin/bash
if [ $1 -ge 60 ]
then
echo “及格了”
elif [ $1 -lt 60 ]
then
echo “不及格”
fi
case 语句
基本语法
case $变量名 in
“值1”)
如果变量的值等于值1,则执行程序1
;;
“值2”)
如果变量的值等于值2,则执行程序2
;;
…省略其他分支…
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac
案例
当命令行参数是1时,输出"周一",是2时,就输出“周二”,其他情况输出“other”
vim testcase.sh
#!/bin/bash
case $1 in
“1”)
echo “周一”
;;
“2”)
echo “周二”
;;
*)
echo “other”
;;
esac
for 循环语句
基本语法1
for 变量 in 值1 值2 值3
do
程序
done
应用案例
打印命令行输入的参数(使用 $* $@)
vim testfor.sh
#!/bin/bash
for i in “$*”
do
echo “the num is $i”
done
结果当做整体 the num is 10 20 30 当做一个整体输出
for j in “$@”
do
echo “the num is $j”
done
结果是 the num is 10
the num is 20
the num is 30
$@是分开处理
基本语法2
for ((初始值;循环控制条件;变量变化))
do
程序
done
应用案例
从1加到100输出显示
SUM=0
for((i=1;i<=100;i++))
do
SUM=$(($SUM+$i))
done
echo “sum=$SUM”
while 循环
基本语法1
while [ 条件判断式 ]
do
程序
done
应用案例
从命令行输入一个数n,统计从1+…+n的值是多少
vim testwhile.sh
#!/bin/bash
SUM=0
i=0
while [ $i -le $1]
do
SUM=
[
[
[SUM+$i]
i=
[
[
[i+1]
done
echo “sum=$SUM”
read 读取控制台的输入
基本语法
read [选项][参数]
-p:读指定的提示符
-t:读取值时等待的时间
参数 变量:指定取值的变量名
案例1
读取控制台的num 值
vim testRead.sh
#!/bin/bash
read -p “请输入一个数num1=” NUM1 程序会阻塞在这里
echo “你输入的值时 num1=$NUM”
案例2
读取控制台输入一个num值,在10s内输入
read -t 10 -p “请输入一个数num2=” NUM2 等待10s
echo “你输入的值时 num2=$NUM”
函数
系统函数
basename基本语法
返回完整路径的最后/部分,常用于获取文件名,如果suffix被指定basename会将pathname或string中的suffix去掉
basename[pathname][suffix]
basename[string][suffix]
案例
请返回/home/aaa/test.txt中test.txt部分
basename /home/aaa/test.txt
直接拿到test.txt
basename /home/aaa/test.txt .txt
返回test
dirname基本语法
返回完整路径最后/的前面的部分,从给定的绝对路径的文件名除去文件名,返回剩下的目录部分
案例
请返回/home/aaa/test.txt的/home/aaa
dirname /home/aaa/test.txt
返回
/home/aaa
自定义函数
基本语法
[function] funname [()]
{
Action;
[return int;]
}
调用直接写函数名:funname[值]
案例1
计算输入的两个参数的和(read),getSum
vim testFun.sh
#!/bin/bash
function getSum(){
SUM=$[$1+$2]
echo “和是=$SUM”
}
read -p “n1” n1
read -p “n2” n2
调用getsum
getSum $n1 $n2
shell编程综合案例
1)每天凌晨2:10 备份数据库atguiguDB到/data/backup/db
2)备份开始和结束给出相应的提示信息
3)备份后的文件要求已备份时间为文件名,打包成.tar.gz的形式
4)检查10天前备份的数据库
编写一个shell脚本
思路分析
vim /usr/sbin/mysql_db_backup.sh
#!/bin/bash
#定义备份的路径
BACKUP=/data/backup/db
#获取当前时间做文件名
DATETIME=$(date +%Y_%m_%d_%H%M%S)
echo “----------开始备份----------”
echo “-----备份的路径是$BACKUP/$DATETIME.tar.gz”
#主机
HOST=localhost
#用户名
DB_USER=root
#密码
DB_PWD=xgh961120
#备份数据库名
DATABASE =atguigudb
#创建备份的路径
#如果备份的路径存在就使用,否则就创建
[ ! -d “$BACKUP/$DATETIME” ] && mkdir -p “$BACKUP/$DATETIME”
#执行mysql备份数据库的指令
mysqldump -u${DB_USER} -p${DB_PWD} --host=$HOST $DATABASE | gzip >$BACKUP/$DATETIME/$DATETIME.sql.gz
#打包备份文件
cd $BACKUP
tar -zcvf $DATETIME.tar.gz $DATETIME
#删除临时文件
rm -rf $BACKUP/$DATETIME
#删除十天前的备份文件
find $BACKUP -mtime+10 -name “*.tar.gz” -exec rm -rf{}\; 删除找到的文件
echo “========备份文件成功”
交给crownd
crontab -e
编辑
10 2 * * * /usr/sbin/mysql_db_backup.sh
ubantu 软件管理操作的相关命令
sudo apt-get update package 更新源
sudo apt-get install package 安装包
sudo apt-get remove package 删除包
sudo apt-get source package 下载该包的源代码
ssh从一台linux连接到另一台linux
ssh 用户名@IP