Linux Shell编程
Shell
shell是一个命令行解释器, 它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动,挂起,停止甚至编写程序
编写
格式要求
- 脚本以
#!/bin/bash
开头 - 脚本需要有可执行权限
执行方式
- 输入脚本的绝对路径或相对路径
- 首先要赋予脚本+x权限:
chmod 744 myShell.sh
- 执行脚本
- 首先要赋予脚本+x权限:
- sh + 脚本直接执行
Shell变量
介绍
- 分为两种:
- 系统变量: $HOME, $PWD, $SHELL, $USER
- 用户自定义变量
- 显示当前shell中所有变量: set
1 | echo "PATH=$PATH" |
定义
语法
- 定义变量: 变量=值
- 撤销变量: unset 变量
- 声明静态变量: readonly 变量. 注意: 不能unset
1 | A=100 |
规则
- 变量名称可以由字母,数字和下划线组成,但是不能以数字开头
- 等号两侧不能有空格
- 变量名称一般习惯为大写
- 将命令的返回值赋给变量
A=`ls -la`
反引号,运行里面的命令,并把结果赋值给变量AA=$(ls-la)
等价于反引号
- 注释
- 单行: #
- 多行: 以
:<<!
开头,!
结尾
设置环境变量
在/etc/profile文件中加入
1 | TOMCAT_HOME=/opt/apache-tomcat-10.0.2 |
使用echo查看
注意要使用source /etc/profile
重新加载
位置参数变量
当我们执行脚本时,如果希望获取到命令行的参数信息,就可以使用到位置参数变量
语法
选项 | 描述 |
---|---|
$n | n为数字,$0代表命令本身,$1-$9代表第1到9个参数,10以上的参数需要用大括号包含: ${10} |
$* | 代表命令行中所有的参数,$8把所有的参数看成一个整体 |
$@ | 代表命令行中所有的参数,吧每个参数区分对待 |
$# | 代表命令行中所有参数的个数 |
预定义变量
就是shell设计者事先定义好的变量,可直接在shell脚本中使用
语法
选项 | 描述 |
---|---|
$$ | 当前进程的进程号(PID) |
$! | 后台运行的最后一个进程的进程号(PID) |
$? | 最后一次执行的命令的返回状态.如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体哪个数由命令自己决定),则证明上一个命令执行不正确了 |
运算符
语法
$((运算式))
$[运算式]
(推荐)expr m + n
- 注意expr运算符间要有空格
- ```expr m - n ````
expr \*,/,%
乘,除,取余
条件判断
语法
- [ condition ]
- 注意:condition前后要有空格
- 非空返回true,可使用$?验证(0为true,>1为false)
- 实例:
- [ yiqing ] 返回true
- [] 返回false
- [ condition ] && OK || echo notok 条件满足执行后面的语句
常用判断条件
- 两个整数的比较
- = 字符串比较
- -lt 小于
- -le 小于等于
- -eq 等于
- -gt 大于
- -ge 大于等于
- -ne 不等于
- 按照文件权限进行判断
- -r 有读权限
- -w 有写权限
- -x 有执行权限
- 按照文件类型进行判断
- -f 文件存在且是一个常规的文件
- -e 文件存在
- -d 文件存在且是一个目录
1 |
|
流程控制
if
语法
if [ 条件判断式 ];then 程序 fi
1
2
3
4
5
6
2. ```shell
if [ 条件判断式 ]
then
程序
elif [ 条件判断式 ]
注意
- [ 条件判断式 ], 中括号和条件判断式之间必须有空格
- if 和后面的中括号之间也要有空格
- 推荐第二种方式
示例
1 | if [ $1 -ge 60 ] |
case
语法
1 | case $变量名 in |
示例
1 | !/bin/bash |
for
语法
for 变量 in 值1 值2 值3... do 程序 done
2. 结果为:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
1. 示例:
```shell
#!/bin/bash
及格了
[root@VM-0-14-centos shell]# ./testIf.sh 61
及格了
[root@VM-0-14-centos shell]# ./testIf.sh 22
不及格
[root@VM-0-14-centos shell]# vim testIf.sh
#!/bin/bash
#打印命令行输入的参数
#使用$*
for i in "$*"
do
echo "the number is $i"
done
#使用$@
for j in "$@"
do
echo "the number is $j"
done1
2
3
4
5[root@VM-0-14-centos shell]# ./testFor.sh 10 20 30
the number is 10 20 30
the number is 10
the number is 20
the number is 30for((初始值;循环控制条件;变量变化)) do 程序 done
2. 结果1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
1. 示例:
```bash
#!/bin/bash
#从1加到100的值输出显示
#定义一个变量
SUM=0
for((i=1;i<=100;i++))
do
SUM=$[$SUM+$i]
done
echo "SUM=$SUM"1
2[root@VM-0-14-centos shell]# ./testFor2.sh
SUM=5050
while
语法
1 | while [ 条件判断式 ] #注意while和条件判断式与中括号之间要有空格 |
示例
1 | !/bin/bash |
读取控制台输入
read
语法
- read [选项] [参数]
- 选项:
- -p 指定读取值时的提示符
- -t 指定读取值时等待的时间(秒), 如果没有在指定的时间内输入, 就不再等待了…
示例
1 |
|
函数
shell有系统函数,也可以自定义函数.
系统函数
basename
返回完整路径最后/的部分,常用于获取文件名
basename [pathname] [suffix]
basename [string] [suffix]
suffix为后缀,如果suffix被指定了, basename会将pathname或string中的suffix去掉
示例
[root@VM-0-14-centos shell]# basename /home/aaa.txt aaa.txt [root@VM-0-14-centos shell]# basename /home/aaa.txt .txt aaa
1
2
3
4
5
6
7
8
9
10
11
12
#### dirname
* 返回完整路径最后/的前面的部分,常用于返回路径部分
* ```dirname 文件绝对路径```
* 示例
* ```bash
root@VM-0-14-centos shell]# dirname /home/aaa.txt
/home
自定义函数
语法
[ function ] funname[()] { Action; [return int;] }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
* 调用直接写函数名: funname [值]
* 示例
* 计算两个参数的和(read)
* ```shell
#!/bin/bash
function getSum(){
SUM=$[$n1+$n2]
echo "和=$SUM"
}
read -p "请输入第一个n1" n1
read -p "请输入第一个n2" n2
#调用getSum
getSum $n1 $n2
综合案例
需求
- 每天凌晨2.10备份数据库到 /data/backup/db
- 备份开始和备份结束能够给出相应的提示信息
- 备份后的文件要求以备份时间为文件名,并打包成.tar.gz的形式
- 在备份的同时,检查是否有10天前备份的数据库文件,如果有就将其删除
代码
在/usr/sbin下面创建脚本
1 | !/bin/bash |
添加到定时任务中
crontab -e
写入
10 2 * * * /usr/sbin/backup/mysql_db_backup.sh