周游Linux操作系统——Shell编程
作者:Rhythm_2019
Emial:rhythm_2019@163.com
学习时间:2021.02.11
终于来到了最重要的部分了,Shell类似于Window的批处理脚本,它可以很方便的执行一系列的指令
Shell 是一个命令行解释器,它为用户提供了一个向 Linux 内核发送请求以便运行程序的界面系统 级程序,用户可以用 Shell 来启动、挂起、停止甚至是编写一些程序
脚本格式要求
- 必须以
#!/bin/bash
开头 - 必须有执行权限
Hello world
只需要创建一个sh
文件,写入下面内容即可
1 | !/bin/bash |
使用chmod
给予执行权限,直接./hello.sh
即可
如果你不想给予权限,你可以使用
sh
指令执行你的脚本
1 sh my.sh
变量
Linux中的变量分为系统变量和用户自定义变量
- 系统变量:$HOME、$PWD、$USER等等,我们可以使用
set
指令查看 - 自定义变量:命名要求和C一样,直接
变量名=值
即可- 撤销变量:unset 变量名
- 声明静态变量:readonly 不可以用unset释放
我们要注意两点:
- 我们习惯使用全大写命名
- 等号左右没有空格
接收返回值
- 使用
$(command)
j,注意是小括号 - 使用
`command`
设置环境变量
其实刚刚已经弄过了,只需要在etc/profile
里面机上
1 | A=B |
即可,然后使用eho $A
查询他得值
位置参数变量
当我们执行shell
脚本的时候,我们其实可以带参数的,像Java一样
1 | ./my.sh 100 200 |
我们可以在脚本里面获取到这些值
1 | echo "第一个参数时$1" |
这个变量叫做位置参数,可以从1数到9,第十个要这样写${10}
。还有下面几个比较常用的符号
$*
表示所有参数(看作整体)$@
表示所有参数(区分)$#
表示参数的数量
其中,$*
和$@
的区别体现在for
循环的时候,Linux的for
和Python
的差不多,都是用in
形式的
预定义变量
其实就是一些约定熟成的变量
- $$ 当前PID
- $! 后台最后一个运行的进程ID
- $? 最后一次执行的指令的返回状态,如果是0说明运行正常,非0表示命令运行可能出现了什么问题
运算符
加减成熟,有两种形式
$(())
或者$[]
:里面直接写算式,比较喜欢这种expr 表达式
其中表达式符号前后要有空格
比如计算 (3 + 8) * 8
1 | echo $[(3+5)*8] |
使用expr
要注意以下几点
- 字符转义
- 使用变量保存结果时可以用
``
或者$()
大家可以多尝试一下
条件判断
[ condition ](注意 condition 前后要有空格)
我们可以这样写
1 | [ condition ] && 语句1 || 语句2 |
来控制逻辑,也可以使用$?验证
1 | [ 111 ] |
如果是true
则显示0,否则显示1
常用的判断:
- 整数的比较:
- = 字符串比较
- -lt 小于
- -le 小于等于
- -eq 等于
- -gt 大于
- -ge 大于等于
- -ne 不等于
- 根据文件权限判断
- r 是否可读
- -w 是否有写权限
- -x 是否有执行权限
- 根据文件类型判断
- -f 文件存在且是个常规文件
- -e 文件存在
- -d 文件存在且是个文件夹
大家自己试试什么效果哈
1 | [ -d /usr/local/mysql ] |
流程控制
主要涉及if
、case
、while
和for
语句
if语句
两种形式
1 | if [ condition ]; then |
或者
1 | if [ condition ] |
case语句
1 | case $变量名 in |
for语句
1 | for 变量名 in 值1 值2... |
或者
1 | for ((i=0;i<=10;i++)) |
while语句
1 | while [ condition ] |
read语句
用户输入,有两个参数
- p 指定提示内容
- t 指定等待时间
函数
函数有分系统提供的系统函数和自己写的自定义函数
常用的系统函数有下面两个:
basename 路径 [后缀]
返回文件名,如果你指定了后缀则只返回前缀
diname l路径
返回路径
自定义函数的写法如下
1 | function func() { |
形参可以不写,直接传过去就行,参数可以用$n
拿到参数
综合案例
需求
- 每天凌晨 2:10 备份 数据库 community 到 /data/backup/db
- 备份开始和备份结束能够给出相应的提示信息
- 备份后的文件要求以备份时间为文件名,并打包成 .tar.gz 的形式,比如: 2018-03-12_230201.tar.gz
- 在备份的同时,检查是否有 10 天前备份的数据库文件,如果有就将其删除
我觉得老师的思路非常清晰,看完以后自己也来谢谢,备份可以使用mysqldump
来实现
1 | 备份 |
卧槽写了一个下午
1 |
|
我以为它很简单的,结果折腾了很久,可能有一些细节之前学习的时候也没留意,这里说一下
关于这个
$
符号:可以
$变量名
、${变量名}
和$(指令)
,如果你只是单独想输出一下变量值可以用$变量名
,但是如果你希望做一些字符换拼接你可能就需要后者,比如你希望拼接路径1
BACKUP_FILE_NAME=${DATABASE_NAME}_$(date +%Y%m%d_%H%M%S).bak
字符串常量带不带双引号都行
关于解压的两个指令
文件 > 目标文件```的形式压缩 1
2
3
4
5
```tar```指令不建议使用绝对路径,如
```shell
tar -zcvf /opt/a.tar.gz /tmp/a.txt如果你是开发
tar
指令的程序员,你一定会感到苦恼,构建压缩文件的时候是先构建tmp
目录再构建a.txt
呢,还是直接构建a.txt
的压缩包呢你可以使用
-P
指定构建多一级目录,或者先cd
进去再压缩find
指令可以配合-exec 指令
使用,记得最后需要加上\;
表示语句结束
最后把他加到crond
里面就好
1 | crontab -e |
添加一行
1 | 0 2 * * * /home/testsh/backup.sh |
就好
关于Shell的所有内容就是这些啦,其实Linux还有好多指令我还没接触到,以后用到了会陆陆续续往博客中添加。好啦,刚好十二点,祝大家牛年大吉,万事顺意!