关于shell
- 运维人员会写一些shell
- 管理集群/开发效率提高需要shell
- shell是一个命令解释器,接收用户的命令,然后调用操作系统内核
- 计算机
- 硬件-linux内核-shell-外层应用程序
- shell是翻译官,是桥梁
- shell可以一行行命令的执行,也可以一堆命令作为脚本来执行
- 红帽系用的默认是bash,ubuntu用的是dash
第一个shell脚本
- 一般后缀是.sh (约定俗称)
- 第一句
#!/bin/sh 指定解析器 - 脚本执行方式
- bash或sh +脚本的绝对or相对路径 (一般不用)
- 直接输入脚本路径直接运行,需要x权限(chmod +x 脚本路径) ./hello.sh
- source or . +脚本路径(用的少)
- source就是一种shell内嵌, . 也差不多, 就是一种shell命令
- 前面两种是在当前的bash shell中起了一个子shell,不影响当前环境
- source是用的是当前shell
- 要考虑到作用范围, 父子之前是否需要交互
- 有时候改一些profile,需要source一下,就是这样的
shell中的变量
- 临时在shell编程中保存的信息
- 分类
- 系统or用户
- 系统一般以$开头
- echo $HOME 看某个变量含义
- env 看所有系统定义的全局变量
- set 看所有变量
- 全局(当前shell)or局部(子shell)
- 自定义变量
- 定义变量 变量名=变量值 =前后不能有空格
- 撤销变量 unset 变量名
- 声明静态变量 readonly变量, 不能unset,不能改
- 直接定义的变量是局部变量
- 如果有空格,需要引号包括
- 父shell定义的全局变量
- 子shell可以看到
- 子shell可以修改,但只限于自己这个环境修改有效,对其他环境修改失败,即使你export,也不行
- 只能在父shell中修改
- 其次,子shell中定义的全局变量,在子shell exit后会消失
- 自定义变量值默认是字符串
- 特殊变量
- 输入参数
- $n表示1-9个参数,如果十以上,用大括号包含,0代表当前脚本名称
- 在字符串中,单引号会将$认为是字符串,而双引号会认为是变量
- $#获取输入参数个数,一般用于循环
- $*将所有参数做成一个整体,
- $@也是获取所有参数,但是分开对待,类似于数组
- $?最后一次执行命令的返回状态 0 为正常执行, 其他是非零,有报错含义
运算符
条件判断
- test 条件 (条件中的等于号一定要空格,不然就一定为0,判断用空格,赋值不用)
- 简写: 直接[ condition ] (前后一定要空格)
- 主要一定要空格,连在一起,就会认为是一个值,就会出问题
- !=为不等于
- 常用判断条件
- 整数之间
- -eq 等于 equal
- -ne不等于 notequal
- -lt小于 less than
- -le小于等于 less equal
- -gt大于 greater than
- -ge大于等于 greater equal
- 文件权限
- 文件类型
- 多条件: && ||
- [condition] && xxx1 || xxx2 (这里就是if-else)
流程控制
for循环
while 循环
read读取控制台输入
函数
-
一段代码的集合 -
脚本本质上也是函数
-
系统函数
-
使用系统函数 $(系统函数) -
-
date 当前时间
-
basename 路径
- 获得最后一个斜杠后面的文件名称
- 参数 suffix 例如 basename xxx.txt .txt 删除后缀
-
dirname
-
自定义函数
归档文件 综合应用联系
-
实现一个脚本,每天对指定目录进行归档备份
- 输入一个目录名称
- 将目录下的所有文件按天归档保存,将归档日期附加在文件名上,放在/root/archive下
-
脚本内容分析
-
if [ $# != 1 ]
then
echo "参数个数错误,只需要1个参数"
exit
fi
if [ -d $1 ]
then
echo
else
echo
echo "目录不存在"
echo
exit
fi
DIR_NAME=$(basename $1)
DIR_PATH=$(cd $(dirname $1);pwd)
DATE=$(date +%y%m%d%H%M)
FILE=archive_${DIR_NAME}_$DATE.tar.gz
DEST=/root/archive/$FILE
echo "开始归档..."
echo
tar -czf $DEST $DIR_PATH/$DIR_NAME
if [ $? -eq 0 ]
then
echo
echo "归档成功!"
echo "归档文件为:$DEST"
echo
else
echo "归档出现问题"
echo
fi
exit
-
exit为退出 -
tar实际上就是备份,归档 -
定时任务
关于echo
- 明显,在函数中其作用为函数的返回值,可以多次返回,但和return这种是不一样的
- 而在最外层命令执行时,它会打印
- 因此,可以这样理解,实际上,它就是将值往外一层返回
- bash为一层,函数再往里一层,只有到bash外,才算打印
|