Shell的基本操作学习总结

前言

从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

  1. 新建脚本文件
    vim hello.sh

  2. 在文件中输入指令
    #!/bin/bash
    echo “hello world”

  3. 给执行权限
    法一:chmod u+x hello.sh
    法二:不给执行权限,直接指定为shell的文件(sh ./hello.sh)

  4. 运行
    ./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.案例综合应用

案例需求

  1. 每天的凌晨2:10备份数据库userInfoDB到/root/db下
  2. 备份开始和结束有相应的提示
  3. 备份文件要求(以备份的时间为文件名称,打包成.tar.gz)例如2020-11-30_163421.tar.gz
  4. 在备份的同时检查是否有十天以上的数据库文件,如果有将其删除

代码实现

#!/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小伙

下一站(javascript)
下一站(html)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值