前言
从2020年11月定下了以后所打算从事的方向开始,就开始学习LINUX基础和LINUX环境编程,故谨以此文来记录Shell的基础操作
声明:因个人能力有限,本文仅是个人的学习记录笔记,有错误之处还望指出
目录
1.Shell的基础介绍
2.变量
3.运算符
4.判断语句
5.流程控制
6.读取控制台输入
7.函数
8.案例综合应用
1.Shell的基础介绍
Shell
从单词上理解,Shell就是壳(与操作系统的内核[kernel]区别)。是一个命令行解释器,可以形象的理解为是用户与操作系统之间的“翻译官”。用户输入指令,Shell将指令转化为操作系统可以读懂的机器语言并且做出相应。
Shell 脚本命令的两种工作方式:交互式和批处理
- 交互式(Interactive):用户每输入一条命令就立即执行。
- 批处理(Batch):由用户事先编写好一个完整的 Shell 脚本,Shell 会一次性执行脚本中诸多的命令。
Bash
Bash(GNU Bourne-Again Shell) 是许多Linux发行版的默认Shell 故在写脚本之前要指定解释器
Shell交互实现
Shell 脚本的格式及要求
- 开头指定解析的目录(以#!/bin/bash 开头)视具体的bash而定
- 给脚本可执行权限(chmod u+x text.sh)注:脚本文件以.sh结尾
例子:用脚本输出hello world
-
新建脚本文件
vim hello.sh -
在文件中输入指令
#!/bin/bash
echo “hello world” -
给执行权限
法一:chmod u+x hello.sh
法二:不给执行权限,直接指定为shell的文件(sh ./hello.sh) -
运行
./hello.sh
2.变量
变量的类别
-
用户自定义变量
顾名思义就是由用户自己定义的变量 -
系统变量
系统已经定义好的变量都是大写 如:HOME ,PATH,USER
变量的定义
- 变量 = 值(A=100)
- 撤销变量(unset A)
- 声明静态变量(readonly 变量名称) 撤销不能unset
变量的命名规则
- 由数字、字母、下划线构成 不能以数字开头 这与C语言一样
- 特别要注意变量和=之间不能有空格 这与C语言不同
- 变量名称习惯大写 这与C语言不同
设置一个环境变量
- 修改配置文件
vim /etc/profile
LD_LIBRARY_PATH=/home/kobe
export LD_LIBRARY_PATH - 让配置文件生效
resource /etc/profile - 查询是否生效
echo $LD_LIBRARY_PATH 变量的输出形式 echo $变量名
位置参数变量
- 案例 :运行./position.sh 10 20
#!/bin/bash
echo " $0 $1 $2"
echo " $*"
echo " $@"
echo " $#"
-
图例
-
$n
$0代表命令本身,$1-$9代表第一到第九个参数 十及以上参数 ${10}
案例输出:./position.sh 10 20 -
$*
命令行中所有参数
案例输出:10 20 -
$@
命令行中所有参数 不过每个参数区分对待
案例输出:10 20 -
$#
命令行中所有参数的个数
案例输出:2
预定义变量
-
$$
当前PID(进程号) -
$!
后台运行的最后一个PID(进程号) -
$?
最后一此执行命令的返回状态 0 正确执行 非0 未成功执行
3.运算符
基本语法- " $((运算式))"或者 $[ 运算式] 推荐后面一种更加容易理解
- expr m + n
运算符应用
- 计算(2+3)*4
A=$[(2+3)*4]
echo "A=$A"
-
图例
-
计算命令行两个参数之和
B=$[$1+$2]
echo "$1+$2=$B"
- 图例
4.判断语句
基本语法
- [ condition ]
condition前后要有空格
非空返回true,可以用$?来测试 0为true >1为false
常用的判断条件
- 两个整数比较 应用的情况较多
= 字符串比较
-lt 小于 less than
-le 小于等于less thanor equal
-eq 等于 equal
-gt 大于 greater than
-ge 大于等于 greater than or equal - 按照文件的权限比较
-r 有读的权限 read
-w有写的权限 write
-x 有执行的权限 execute - 按照文件的类型比较
-f 文件存在并且是常规文件 file
-e 文件存在 exist
-d 文件存在并且是目录 dictionary
管道,套接字,软链接不是很常用这里不再过多赘述
判断条件案例
- 判断"ok" 是否等于"ok"
if [ "ok"="ok" ]
then echo "equal"
fi
- 图例
- 23是否大于21
if [ 23 -gt 21 ]
then echo "yes"
fi
-
图例
-
/home/kobe文件是否存在否则输出manba out
if [ -f /home/kobe ]
then echo "exist"
else echo "manba out"
fi
- 图例
5.流程控制
if判断
- 语法
if [ 条件判断 ]
then 程序
fi
或者
if [ 条件判断 ]
then 程序
elif [ 条件判断 ]
then 程序
fi
if的结尾就是if反着写
- 案例:判断用户输入是否大于60,大于等于输出及格,否则输出不及格
if [ $1 -ge 60 ]
then echo "及格"
elif [ $1 -lt 60 ]
then echo "不及格"
fi
- 图例
case语句
- 语法
case $变量名 in
"值1")
如果变量等于值1,执行此程序
;;
"值2")
如果变量等于值1,执行此程序
;;
*)
都不满足的时候执行此
;;
esac
case的结尾就是case反着写
- 案例:判断用户输入1是输出周一,输入2时输出周二,其余为other
case $1 in
"1")
echo "周一"
;;
"2")
echo "周二"
;;
*)
echo "other"
;;
esac
- 图例
for循环
- 语法1 不推荐,不好记忆
for 变量 in 值1 值2 值3
do 程序 done
- 语法2 强力推荐,与C语言类似,就是双层括号不同,其余一样
for((初值;条件;变化))
do 程序 done
- 案例:打印1-100的和
SUM=0
for((i=1;i<=100;i++))
do SUM=$[$SUM+$i]
done
echo "SUM=$SUM"
- 图例
while循环
- 语法 不推荐,不好记忆
while [条件]
do 程序
done
- 案例:输出1+2+3+…+用户指定的数字
SUM=0
i=1
while [ $i -le $1 ]
do SUM=$[$SUM+$i]
i=$[$i+1]
done
echo "SUM=$SUM"
- 图例
6.读取控制台输入
read函数的使用
read (选项)[参数]
-p :指定读取时候的提示符号
-t :指定读取的时候等待时间
(如果未在指定时间内输入则不再等待)
read案例
- 读取控制台输入的一个num值
read -p "请输入num的值" num
echo "num=$num"
- 图例
- 读取控制台输入的一个num值限定三秒内输入
read -t 3 -p "请输入num的值" num
echo "num=$num"
- 图例
7.函数
系统函数
- basename函数
功能:返回完整路径最后 / 的部分 (常用于获取文件名) - dirname函数
功能:返回完整路径 / 的前面部分 (常用于获取文件路径)
自定义函数
- 语法
[function] functionname()
{
action;
[return int;]
}
-
调用
直接输入函数名称,即使有参数也无需()参数直接写在函数名称后,用空格隔开 这与C语言不同 -
案例:计算两个参数之和
function getsum(){
SUM=$[$N1+$N2]
echo "N1+N2=$SUM"
}
#读取用户输入
read -p "第一个参数" N1
read -p "第二个参数" N2
#调用函数
getsum $N1 $N2
- 图例
8.案例综合应用
案例需求
- 每天的凌晨2:10备份数据库userInfoDB到/root/db下
- 备份开始和结束有相应的提示
- 备份文件要求(以备份的时间为文件名称,打包成.tar.gz)例如2020-11-30_163421.tar.gz
- 在备份的同时检查是否有十天以上的数据库文件,如果有将其删除
代码实现
#!/bin/bash
#这是数据库备份的脚本
#备份到的路径
BACKUP=/root/db
#以时间结尾的文件名
FILE_TIME=$(date +%Y-%m-%d_%H%M%S)
#echo $FILE_TIME
echo "========================开始备份============================="
echo "===================路径:$BACKUP/$FILE_TIME.tar.gz======================"
#判断要备份的路径是否存在如果不存在则新建一个
[ ! -d $BACKUP/$FILE_TIME ] && mkdir -p $BACKUP/$FILE_TIME
#数据库相关信息
DB_USER=root
DB_PWD=123
HOST=localhost
DB=userInfoDB
#备份数据库
mysqldump -u${DB_USER} -p${DB_PWD} --host=$HOST $DB | gzip > $BACKUP/$FILE_TIME/$FILE_TIME.sql.gz
#打包备份文件
cd $BACKUP
tar -zcvf $FILE_TIME.tar.gz $FILE_TIME
rm -rf $BACKUP/$FILE_TIME
#此处为在新建的时候创下的目录
rm -rf /root/root
#先在指定路径下找时间大于10天的文件(文件以.tar.gz结尾)然后执行删除命令
find $BACKUP -mtime +10 -name "*.tar.gz" -exec rm -rf {} \;
#最后将这个脚本交给crond执行指定执行的时间为每天的凌晨两点十分(10 02 * * * /root/updata.sh)
echo "=============================备份完成===================================="
图例
-
结果图
-
数据库结果图
总结
学完了LINUX的操作之后,感觉自己懂了很多,但是又不知道到底懂了什么。在感谢尚硅谷的韩老师,他的课程让我开始一点点走进LIUNX的大门。做了最后一个综合案例,开始有点成就感来,原来LINUX可以做的事情还是很多的,但是就目前而言自己所学的还是冰山一角,与想要参与到LINUX的开源社区做贡献所需要的知识还远远不够。所以接下来还有很长的路,而赛过要努力呀!
如果你对LINUX的基础操作不是很了解建议看我上一篇博文 —> LINUX的基本操作
而塞过 2021-1-7
关于我:一个就要进入互联网,经历社会毒打的99小伙