title: 02-Shell 入门
meta:
- name: description
content: 了解什么是Shell、Shell脚本
什么是Shell
- Shell是一个命令解释器,是用户访问Linux操作系统内核服务的桥梁。
- 分类
- 窗口shell -> gnome, kde, explorer.exe
- 命令行shell -> bash, cmd.exe, powershell.exe
- shell历史
- sh -> ksh -> csh -> bash
- Bourne shell是UNIX最初使用的shell,并且在每种UNIX上都可以使用。Bourne shell在shell编程方面相当优秀,但在处理与用户的交互方面做得不如其他几种shell。
- Bourne Again shell,它是Linux操作系统默认的shell,是Bourne shell的扩展,简称Bash,与Bourne shell完全向后兼容,并且在Bourne shell的基础上增加、增强了很多特性。
- Dash,GNU/Linux操作系统中的/bin/sh本是bash (Bourne-Again Shell) 的符号链接,但鉴于bash过于复杂,有人把bash从NetBSD移植到Linux并更名为dash (Debian Almquist Shell),并建议将/bin/sh指向它,以获得更快的脚本执行速度。Dash Shell 比Bash Shell小的多,符合POSIX标准。
dash 比 bash 更轻,更快。但 bash 却更常用。如果一些命令、脚本等总不能正常执行,有可能是 dash 的原因。
可以直接修改 /bin/sh 链接文件,将其指定到 /bin/bash:
sudo ln -fs /bin/bash /bin/sh
或
sudo dpkg-reconfigure dash
Shell-初体验
- 编辑文件
#!/bin/sh
echo "Hello world!"
echo "666"
- 修改权限
chmod +x test.sh
- 执行Shell脚本
./test.sh
or
sh ./test.sh
Shell脚本(Shell Script)
- Shell脚本是为Shell编写的脚本程序
- Shell命令执行特点: 逐行输入命令,逐行确认
开发规范
1. 命名:要有意义,eg. `xxx.sh`
2. 首行:必须是命令解释器 eg. `#!/bin/bash`
3. 注释:简单描述脚本信息 eg. `# 测试命令输入`
4. 执行:`sh 脚本文件.py` or `bash 脚本文件.py` or `./xxx.py`
5. 规范:成对符号成对写 `() [] {} "" `
source
使用source执行加载shell脚本,可以保证环境一致性,将shell脚本中定义的环境变量在当前环境也生效。
source xxx.sh
Why Shell
- Shell脚本直接调用系统命令执行,效率高
- Python:导入模块->模块调用系统命令->执行
title: 03-Shell 基本语法1
meta:
- name: description
content: 入门Shell基本语法
注释
- 单行注释
# 我是单行注释
- 多行注释
:<<!
这里是多行注释!
作者:poplar
时间:2019年5月5日20:53:21
联系:[email protected]
!
: '
这里是多行注释!
作者:poplar
时间:2019年5月5日20:53:21
联系:[email protected]
'
Shell变量
存储动态值的抽象概念;变量名不变,变量值可变
变量分类:
- 本地变量:在本地有效
- 全局变量:在当前系统下,所有环境都有效
- 内置变量:bash中默认包含一些变量,可直接使用
本地变量
普通变量
变量名=变量值
:变量值必须是一个整体,中间不能有特殊字符变量名='变量值'
:看到的内容和输出的内容一致变量名="变量值"
:如果在变量A的变量值范围内,有可以解析的变量B,那么就首先解析变量B,将B的结果和其他内容组合后,再赋值给A
eg.
poplar@PoplarTang:~/Lesson$ val_b=itcast
poplar@PoplarTang:~/Lesson$ val_a='hello $val_b'
poplar@PoplarTang:~/Lesson$ echo $val_a
hello $val_b
poplar@PoplarTang:~/Lesson$ val_a="hello $val_b"
poplar@PoplarTang:~/Lesson$ echo $val_a
hello itcast
命令变量
注意等号左右两边不能有空格
变量名=`命令`
变量名=$(命令)
- 执行流程
1、执行命令
2、将命令执行后的结果,赋值给变量名
eg.
wo=$(whoami)
echo $wo
如何查看变量
echo $变量名
echo "aaa ${变量名} bbb ccc"
全局变量
-
定义方式:
- 定义一个本地变量
- 使用
export
声明这个本地变量为全局变量
itcast1=haha666 export itcast1 # 合并为1步 export itcast2=test123 env | grep itcast # output itcast2=test123 itcast1=haha666
-
删除变量:
unset itcast1
内置变量
查看bash内置变量:man bash
-
与脚本文件有关系的变量
$0
获取脚本的名称$#
获取脚本的参数数量$n
获取指定位置的参数$?
获取上一个命令执行的返回值
-
字符串相关的内置变量
截取字符串
${变量名:起始位置:截取长度}
- 从索引3取5位:
echo ${str:3:5}
- 从开始取2位:
echo ${str:0:2}
- 从开始到倒数第3位:
echo ${str::-2}
- 末尾2位:
echo ${str:0-2}
orecho ${str: -2}
- 从索引3取5位:
变量的默认值
变量为null 或 空字符串时使用默认值:${变量名:-默认值}
a=123
echo "test: ${a:-666}"
echo "test: ${b:-666}"
# 输出
test: 123
test: 666
变量不为空时使用默认值:${变量名:+默认值}
a=123
echo "test: ${a:+666}"
echo "test: ${b:+666}"
# 输出
test: 666
test:
Shell数组
-
定义
arr=(A "B" C D)
or
arr[0]=A arr[1]=B arr[2]=C arr[3]=D
-
获取指定元素
cho "元素1:${arr[1]}"
-
获取所有元素及长度
echo "数组的所有元素:${arr[*]} 长度${#arr[*]}"
title: 05-Shell 脚本案例
meta:
- name: description
content: 通过案例掌握脚本
案例是最好的老师,通过练习不同场景下的案例,来掌握Shell脚本的语法是最有效的学习方式之一。
参数个数判断并打印
#/bin/bash
:<<!
1.要求用户在执行程序时传入2-5个水果
2.如果参数不符合条件, 提示用户并退出程序.
3.打印这几种水果
!
if [[ $# < 2 || $# > 5 ]]
then
echo "参数只能有2-5个"
exit
fi
for i in $*;do
echo "喜欢吃的水果: ${i}"
done
打印九九乘法表
#!/bin/bash
# 打印多行
for i in $(seq 9); do
# 打印每行的内容
for j in $(seq $i); do
# 不换行输出
echo -n "${i}*${j}=$((i*j)) "
done
echo ""
done
备份&清理备份
#!/bin/bash
: '
1. 将指定目录/home/poplar/Lesson/Backup/Python所有文件打包成xxx.tar.gz
2. 将包含日期信息的xxx.tar.gz存放在/home/poplar/Lesson/Backup/
3. 删除非一个月以内的备份文件
'
# 生成备份日期
date_log=`date "+%Y%m%d"`
# 根据日期生成打包数据
tar -zcvf /home/poplar/Lesson/Backup/Python_${date_log}_bak.tar.gz /home/poplar/Lesson/Python
# 删除非一个月以内的备份文件
find /home/poplar/Lesson/Backup/ -name "*bak.tar.gz" -mtime +30 | xargs rm -f
title: 06-Linux 定时任务cron
meta:
- name: description
content: 在Linux下通过cron服务执行定时的任务
Linux定时任务cron
cron服务
在Ubuntu中,定时任务cron服务默认被安装。可以通过以下命令操作该服务:
service cron status
查看服务运行状态service cron start
启动服务service cron stop
停止服务service cron restart
重启服务
crontab命令
crontab -e
编辑crontab文件crontab -l
显示crontab文件crontab -ir
提示并删除crontab文件cat /var/spool/cron/crontabs/root
直接查看crontab文件
编写cron
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mVsnnvDO-1581957178381)(./assets/01-rule-cron.png)]
进入crontab编辑状态:
- 每分钟获取一次时间, 记录到 /tmp/test-date.log
*/1 * * * * echo `date` >> /tmp/test-date.log
- 每分钟执行一次sh脚本任务backup.sh
*/1 * * * * /home/poplar/Lesson/backup.sh > /tmp/day-backup.log
- 每周上午5点备份一次/home/
0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
其他
select-editor
重选默认编辑器