Shell
概述
1、一个命令行解释器,为用户提供一个向 Linux 内核,发送请求以便运行程序的界面系统级程序
2、用户可以用 Shell 来启动、挂起、停止、编写程序
3、外部 -> 内部:应用程序 -> Shell -> 内核 -> 硬件
脚本格式要求
1、以 #!/bin/bash 开头
2、需要有可执行权限
3、拓展名为 .sh
常用执行方式
1、方式一
(1)输入脚本的绝对路径或相对路径
(2)要赋予 .sh 脚本的 x 权限(执行权限),再执行脚本
2、方式二
(1)sh + 脚本
(2)不用赋予脚本 x 权限,直接执行即可
变量
1、Linux Shell 中的变量分为:系统变量、用户自定义变量
2、系统变量:
3、set:显示当前 Shell 中所有变量
4、语法
(1)定义变量:变量名=值
(2)撤销变量:unset 变量名
(3)声明静态变量:readonly 变量名=值
(4)注意:静态变量不能 unset
(5)引用变量:
5、定义规则
(1)变量名可由字母数字和下划线组成,但是不能以数字开头
(2)等号两侧不能有空格
(3)变量名一般习惯为大写
6、将命令的返回值赋给变量
(1)变量名=`命令`
(2)变量名=$(命令)
设置环境变量
1、语法
(1)export 变量名=变量值:将 Shell 变量输出为环境变量 / 全局变量
(2)source 配置文件:使修改后的配置信息立即生效
(3)echo $变量名:查询环境变量的值
2、Shell 脚本的多行注释
(1):<<!内容!
位置参数变量
1、执行 Shell 脚本时,使用到位置参数变量,可以获取到命令行的参数信息
2、语法
(1)
(2)
(3)
(4)$#:代表命令行中所有参数的个数
预定义变量
1、Shell 设计者事先已经定义好的变量,可以直接在 Shell 脚本中使用
2、语法
(1)$$:当前进程 PID
(2)$!:后台运行的最后一个进程 PID
(3)$?:最后一次执行的命令的返回状态,若该变量值为 0,证明上一个命令正确执行;若该变量值为非 0(由命令决定具体数值),则证明上一个命令执行不正确
运算表达式
1、$((运算式))
2、$[运算式]
3、expr 运算式
(1)expr 运算符之间要有空格
(2)如果希望将 expr 结果赋给某个变量,使用 ``
4、运算符
(1)+:加
(2)-:减
(3)\*:乘,用于 expr
(4)*:用于 $
(5)/:除
(6)%:取余
条件判断
1、判断语句:[ 条件判断式 ]
(1)注意:条件判断式前后需要空格
(2)非空返回 true,可使用 $? 验证:0 为 true,>1 为 false
2、判断语句
(1)=:字符串比较
(2)-lt:小于
(3)-le:小于等于
(4)-eq:等于
(5)-gt:大于
(6)-ge:大于等于
(7)-ne:不等于
(8)-r:有读权限
(9)-w:有写权限
(10)-x:有执行权限
(11)-f:文件存在,且为常规文件
(12)-e:文件存在
(13)-d:文件存在,且为目录
3、||:如果前一条命令为真,则后面的命令不会执行,如果前一条命令为假,则继续执行后面的命令
4、&:同时执行多条命令,不管命令是否执行成功
5、&&:同时执行多条命令,当碰到执行错误的命令时,将不再执行后面的命令,如果一直没有错误的,则执行全部命令
流程控制
1、if 判断
(1)单分支
if [ 条件判断式 ]
then
代码
fi
(2)多分支
if [ 条件判断式 ]
then
代码
elif [ 条件判断式 ]
then
代码
fi
2、case 判断
case $变量名 in
"值1")
变量值等于值1,执行此代码
;;
"值2")
变量值等于值2,执行此代码
#省略其他分支
*)
变量值都不符合以上值,执行此代码
;;
esac
3、for 循环
for 变量 in 值1 值2...
do
代码
done
for(( 循环变量初始化;循环条件;循环变量迭代 ))
do
程序/代码
done
4、while 循环
while [ 条件判断式 ]
do
代码
done
读取控制台输入
read [-ers] [-a aname] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name ...]
1、从标准输入读取单行数据
2、可以用来读取键盘输入,当使用重定向的时,可以读取文件中的一行数据
3、选项
(1)-a 变量:该变量会被认为是个数组,然后给其赋值,默认是以空格为分割符
(2)-d 标志符:其实只有其后的第一个字符有用,作为结束的标志
(3)-p "提示信息":在输入前打印提示信息
(4)-e:在输入的时候可以使用命令补全功能
(5)-n 数字:定义输入文本的长度
(6)-r:屏蔽 \,如果没有该选项,则 \ 作为一个转义字符,若有,\ 是正常字符
(7)-s:安静模式,在输入字符时不再屏幕上显示,例如 login 时输入密码
(8)-t 秒数:定义输入字符的等待时间,如果没有在指定的时间内输入,就不再等待
(9)-u fd:从文件描述符中读入,该文件描述符可以是 exec 新开启的
系统函数
1、basename 路径名/字符串 后缀
(1)删掉所有的前缀,包括最后一个 / 字符,返回完整路径最后 / 的部分,常用于获取文件名
(2)系统函数
(3)后缀名为可选项
2、dirname 文件绝对路径
(1)返回完整路径最后 / 的前面部分,常用于返回路径部分
(2)去除绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分)
自定义函数
1、定义
function 函数名() {
执行代码
#没有返回值,可以省略return
return 返回值
}
2、调用
函数名 实参1 实参2...
定时备份数据库(例)
1、Shell 脚本
#!/bin/bash
#备份目录
BACKUP=/data/backup/db
#当前时间
DATETIME=$(date +%Y-%m-%d %H:%M:%S)
#数据库地址
HOST=localhost
#数据库用户名
USER=root
#数据库密码
PASSWORD=123456
#备份的数据库名
DATABASE=backupdb
#检查备份目录,若不存在,则创建
[ ! -d "${BACKUP}/${DATETIME}" ] && mkdir -p "${BACKUP}/${DATETIME}"
#备份数据库,并重定向压缩到指定目录
mysqldump -u${USER} -p${PASSWORD} --host=${HOST} -q -R --databases ${DATABASE} | gzip > ${BACKUP}/${DATETIME}/${DATETIME}.sql.gz
#将备份文件夹打包为tar
cd ${BACKUP}
tar -zvcf ${DATETIME}.tar.gz
#删除对应的备份文件夹
rm -rf ${BACKUP}/${DATETIME}
#删除10天前的备份文件
find ${BACKUP} -atime +10 -name ".tar.gz" -exec rm {} \;
echo "备份${DATETIME}完成"
2、设置定时执行
crontab -e 0 2 * * * sh 备份脚本路径
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战