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、系统变量:HOMEPWD、SHELLUSER 等

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)nn0 代表命令本身,19 代表第一到第九个参数,十以上的参数需要用大括号包含,如:${10)

(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 备份脚本路径
posted @   半条咸鱼  阅读(114)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示