02-shell-introduce


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
  1. Bourne shell是UNIX最初使用的shell,并且在每种UNIX上都可以使用。Bourne shell在shell编程方面相当优秀,但在处理与用户的交互方面做得不如其他几种shell。
  2. Bourne Again shell,它是Linux操作系统默认的shell,是Bourne shell的扩展,简称Bash,与Bourne shell完全向后兼容,并且在Bourne shell的基础上增加、增强了很多特性。
  3. 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"

全局变量

  • 定义方式:

    1. 定义一个本地变量
    2. 使用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} or echo ${str: -2}

变量的默认值

变量为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 重选默认编辑器
发布了46 篇原创文章 · 获赞 7 · 访问量 7078

猜你喜欢

转载自blog.csdn.net/hongge_smile/article/details/104367821