【Linux】Shell脚本详解

news2024/11/17 1:38:57

目录

  • 一.概述
  • 二.Linux提供的Shell解析器
  • 三.Shell入门
    • 1.执行一个简单的shell脚本
    • 2.脚本常用的执行方法
  • 四.变量
    • 1.系统预定义变量
    • 2.自定义变量
    • 3.特殊变量
  • 五.运算符
  • 六.条件判断
    • 1.单条件判断
    • 2.多条件判断
  • 七.流程控制(重点)
    • 1.if判断
    • 2.case语句
    • 3.for循环
    • 4.while循环
  • 八.read读取控制台输入
  • 九.函数
    • 1.系统函数
  • 十.正则表达式
  • 十一.文本处理工具
  • 十二.实际案例

一.概述

Shell是一个命令行解释器,它接收应用程序或者用户的命令,然后调用操作系统内核。
我们把很多命令放在一个文件,让Shell去执行,这个文件就叫脚本文件。

在这里插入图片描述


二.Linux提供的Shell解析器

# cat /etc/shells   //查看解析器类型
# echo $SHELL       //查看解析器,CentOS默认是/bin/bash

在这里插入图片描述

三.Shell入门

#!/bin/bash 开头  //指定解析器

1.执行一个简单的shell脚本

①建一个hello.sh文件(# touch hello.sh)。
②打开hello.sh文件(# vim hello.sh),并写入 #!/bin/bashecho"hello,world"
③执行hello.sh文件

2.脚本常用的执行方法

第一种:采用 bash 或 sh 加 脚本的相对路径或绝对路径(不用赋予脚本 +x 权限)

sh+脚本的相对路径
# sh ./hello.sh

sh+脚本的绝对路径
# sh /root/shells/hello.sh

bash+脚本的相对路径
# bash ./hello.sh

bash+脚本的绝对路径
# bash /root/shells/hello.sh

第二种:输入脚本的绝对路径或相对路径执行脚本(必须赋予脚本 +x 权限)
# chmod +x shells/hello.sh   //先赋予脚本可执行权限(x)

相对路径
# ./hello.sh

绝对路径
# /root/shells/hello.sh

四.变量

1.系统预定义变量

常用系统变量
$HOME、$PWD、$SHELL、$USER等。

查看系统变量
# echo $SHELL

显示所有变量
# set

显示系统全局变量
# env

2.自定义变量

基本语法
(1)定义变量:变量名=变量值。注意: =号前后不能有空格
(2)撤销变量:unset 变量名
(3)声明只读变量:# readonly 变量名=变量值。注意:不能 unset
(4)# export 变量名 //由局部变量变为全局变量

变量定义规则
(1)变量名称可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写。
(2)在bash中,默认都是字符串类型,无所进行运算。
(3)变量的值如果包含空格,需要用双引号或单引号包含起来。 

示例:

[root@liu100 ~]# my_test="hello world"   //自定义变量
[root@liu100 ~]# echo $my_test           //打印自定义变量
hello world
[root@liu100 ~]# readonly a=9            //自定义可读变量
[root@liu100 ~]# a=99                    //修改可读变量(不可修改)
-bash: a: 只读变量
[root@liu100 ~]# unset my_test           //撤销自定义变量
[root@liu100 ~]# echo $my_test           //打印已经撤销的变量,已经没有了

[root@liu100 ~]# unset a			     //撤销自定义可读变量(不可撤销)
-bash: unset: a: 无法反设定: 只读 variable

3.特殊变量

$n     //n的取值为 $0 表示脚本名称,$1-$9 代表一到九个参数,大于10,需要 ${10}这种形式。

hello.sh 脚本内容
在这里插入图片描述

hello1hello2 是我们输入的两个参数值
在这里插入图片描述

$#  //获取我们当前输入参数的个数

在这里插入图片描述

在这里插入图片描述

$*  //获取命令行所有的参数,把所有参数看做一个整体
$@  //获取命令行所有的参数,把每个参数区分开来,相当于把参数放在一个集合中

在这里插入图片描述

在这里插入图片描述

$?  //最后一次执行命令的返回状态。返回值是0代表上一个命令执行正确,否则上一个命令执行错误

在这里插入图片描述

五.运算符

$((运算式))或$[运算式]  //对数字进行运算

在这里插入图片描述

六.条件判断

1.单条件判断

注意:条件表达式不是空即为 true,否则为 false,使用 $? 判断返回的是啥,0对应true,1对应false

# test 条件表达式   //条件判断
[ 条件表达式 ]      //条件判断,前后都有空格

(1) 整数比较

注意字符串比较使用 = 判断相等,!= 判断不相等

常用判断条件作用
-eq等于(equal)
-ne不等于(not equal)
-lt小于(less than)
-le小于等于(less equal)
-gt大于(greater than)
-ge大于等于(greater equal)

(2) 按照文件权限比较

常用判断条件作用
-r读的权限
-w写的权限
-x执行的权限

(3) 按照文件类型比较

常用判断条件作用
-e文件存在(exittence)
-f文件存在并且是一个文件(file)
-d文件存在并且是一个目录(directory)
[root@liu100 ~]# [ 1 = 2 ]              //1=2吗 false
[root@liu100 ~]# echo $?
1
[root@liu100 ~]# [ 1 = 1 ]              //1=1吗 true
[root@liu100 ~]# echo $?
0
[root@liu100 ~]# [ 1 -gt 2 ]            //1>2吗 false
[root@liu100 ~]# echo $?
1
[root@liu100 ~]# [ -x hello.sh ]        //hello.sh有执行权限吗 false
[root@liu100 ~]# echo $?
1
[root@liu100 ~]# [ -f /home/jjr ]       // /home/jjr存在并且是文件吗 false
[root@liu100 ~]# echo $?
1
[root@liu100 ~]# [ -d /home/jjr ]       // /home/jjr存在并且是目录吗 true
[root@liu100 ~]# echo $?
0

2.多条件判断

多条件判断 && 表示前一条命令执行成功,才会执行,|| 表示前一天命令执行失败才会执行和java里面的三元运算符类似。

在这里插入图片描述

七.流程控制(重点)

1.if判断

基本语法

(1) 单分支

if  [ 条件判断式 ]; then
    程序
fi
 
或者

if  [ 条件判断式 ]
then
    程序
fi

(2) 多分支

if  [ 条件判断式 ]
then
    程序
elif [ 条件判断式 ]
then
	程序
else
	程序
fi

注意事项
	(1)  if 后面有空格, [ 条件判断式 ] 中括号里面前后也有空格。
	(2)  -a 相当于java里面的and,-o 相当于java里面的or。

多个条件判断式
在这里插入图片描述

脚本文件内容
在这里插入图片描述

执行脚本文件的结果
在这里插入图片描述

2.case语句

基本语法

case $变量值 in
"值1")
	变量值等于值1,执行程序1
;;
"值2")
	变量值等于值2,执行程序2
;;
 ...其他分支
 *)
 	不匹配上面的所有值,执行这个程序
;;
esac

注意事项
      (1)  ;; 相当于java里面的 break
      (2)  *) 相当于java里面的 default

脚本文件内容
在这里插入图片描述

执行脚本文件的结果
在这里插入图片描述

3.for循环

基本语法

for ((初始值;循环控制条件;变量变化))
do
	程序
done

或者

for 变量 in 值1 值2 值3...
do
	程序
done

相当于java加强for循环

脚本内容 1-100 累加(普通for循环)
在这里插入图片描述
脚本执行结果
在这里插入图片描述
脚本内容 1-100 累加(加强for循环),执行结果和上图一样
在这里插入图片描述

4.while循环

基本语法

while [ 条件判断式 ]
do
	程序
done

脚本内容 1-100 的累加
在这里插入图片描述
在这里插入图片描述


八.read读取控制台输入

基本语法

read [选项][参数]
选项:
	-p:指定读取时的提示符
	-t:指定读取值时等待的时间(秒) 如果不加-t表示一直等待
参数:
	变量:指定读取值得变量名

脚本内容

在这里插入图片描述

执行脚本结果
在这里插入图片描述

九.函数

1.系统函数

  • basename
基本语法

basename [string/pathname] [后缀名]  //删除所有前缀,包括最后一个 / 字符(取路径里面的文件名称),如果加上后缀,他会把文件名里的后缀去掉

在这里插入图片描述

  • dirname
基本语法

dirname 文件绝对路径  //从绝对路径中去除非目录的部分,然后返回目录的部分

在这里插入图片描述

  • 自定义函数
基本语法

function(可省略)  函数名()    //()也可省略
{
	程序;
	return int; //可省略,通过 $? 获取返回值
}

脚本内容
在这里插入图片描述
执行结果
在这里插入图片描述

十.正则表达式

常用特殊字符

  ^  //匹配一行的开头
  例如:# cat /etc/passwd | grep ^a    //匹配a开头的行
	
  $  //匹配一行的结束
  例如:# cat /etc/passwd | grep b$    //匹配b结束的行
   
  .  //匹配一个任意字符
  例如:# cat /etc/passwd | grep c..d  //匹配开头是c结尾是d的四个字符长度的所有行

  *  //表示匹配前一个字符0次或者多次
  例如:# cat /etc/passwd | grep e*f  //匹配e开头f结尾的不限长度的行

  []        //匹配某个范围的字符
  [6,8]     //匹配6和8
  [5-8]    	//匹配5到8
  [0-9]*    //匹配任意长度的数字字符串
  [a-z]     //匹配a-z之间的字符
  [0-5,7-9] //匹配0-5或7-9之间的任意数字
  例如:# cat /etc/passwd | grep g[a,b,c]h  //匹配g开头h结尾之间必须是a或b或c的行

  \ //表示转义  \* 代表 *符号
	

十一.文本处理工具

  • cut
注意:默认分隔符是制表符
# cut [可选参数] 文件内容  //文件中负责剪切数据
# cut -f 1,2 -d " "       //第一列和第二列按照 " "进行分割
参数作用
-f列号,提取第几列
-d分隔符,默认是制表符
-c按照字符进行分割,后面加n,表示取第几列 比如:-c 2
  • awk
# awk [可选参数] '/pattern1/{action1} /pattern2/{action2}' 文件内容
参数作用
-F指定文件分隔符
-v赋值一个用户自定义变量

十二.实际案例

归档文件
需求:实现每天对指定目录归档备份的脚本,输入一个目录名称(末尾不带/),将目录下所有文件按天归档保存,并将日期附件在归档文件名上,放在 /home/jjr 目录下。
脚本内容:

#!/bin/bash
#判断输入的参数是一个

if [ $# -ne 1 ]
then
        echo "仅能输入一个参数"
        exit
fi

#获取参数中的目录

if [ -d $1 ]
then
        echo
else
        echo "目录不存在"
        exit
fi

#获取你输入的路径的最后一个文件名或目录
file_name=$(basename $1)
#获取你输入路径的全路径
path_name=$(cd $(dirname $1);pwd)

#获取当前日期
DATE=$(date +%y%m%s)

#定义归档文件名称
file=ikun_${file_name}_$DATE.tar.gz
DIR=/home/jjr/$file

#归档

echo "开始归档"

tar -czf $DIR $path_name/$file_name

if [ $? -eq 0 ]
then
        echo "归档成功"
else
        echo "归档失败"
fi

exit

在这里插入图片描述
设置定时任务

# crontab -e //编辑定时任务,保存之后就会执行。     crontab -l 查看定时任务

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/63662.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【论文简述】 Point-MVSNet:Point-Based Multi-View Stereo Network(ICCV 2019)

一、论文简述 1. 第一作者:Rui Chen、Songfang Han 2. 发表年份:2019 3. 发表期刊:ICCV 4. 关键词:MVS、深度学习、点云、迭代改进 5. 探索动机:很多传统方法通过多视图光度一致性和正则化优化迭代更新&#xff…

C语言实例|使用C程序优雅地杀掉其它程序进程

C语言文章更新目录 C语言学习资源汇总,史上最全面总结,没有之一 C/C学习资源(百度云盘链接) 计算机二级资料(过级专用) C语言学习路线(从入门到实战) 编写C语言程序的7个步骤和编程…

FPGA 20个例程篇:18.SD卡存放音频WAV播放(中)

第七章 实战项目提升,完善简历 18.SD卡存放音频WAV播放(中) 如图1所示是WM8731中11个寄存器功能说明概况图,我们需要对照手册,再去深入了解WM8731中的11个寄存器,怎么去配置这些寄存器达到预期的效果&…

了解3dmax坐标系

3dmax具有多种坐标系,其类别如下;默认的是View坐标系; 新建一个茶壶,此时默认是View坐标系; 切换到屏幕坐标系,看一下如下图;要保持视口区域激活; 根据资料,屏幕坐标系&a…

园区如何快速实现数据可视化分析?

对于园区运营方来说,如果没有专业针对性的管理方案以及管理系统辅助的话,实现园区可视化管理的难度非常大,而且操作成本会很高。但如果园区运营方选择引进快鲸智慧楼宇推出的园区数据孪生可视化管理系统的话就会简单很多。 快鲸智慧楼宇数据孪…

视频学习|Springboot在线学习系统

作者主页:编程千纸鹤 作者简介:Java、前端、Pythone开发多年,做过高程,项目经理,架构师 主要内容:Java项目开发、毕业设计开发、面试技术整理、最新技术分享 收藏点赞不迷路 关注作者有好处 文末获得源码 …

对文本进行情感分析(分类)snownlp模块

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 对文本进行情感分析(分类) snownlp模块 选择题 对于以下python代码表述错误的一项是? from snownlp import SnowNLP myText我爱学python! print("【显示】text"…

艾美捷ICT FLICA天冬氨酸蛋白酶(Caspase)活性检测试剂盒说明书

Caspases在细胞凋亡和炎症中发挥重要作用。艾美捷ICT FLICA天冬氨酸蛋白酶(Caspase)活性检测试剂盒被研究人员用于通过培养的细胞和组织中的胱天蛋白酶活性来定量凋亡。用FAM FLICA caspase-1测定试剂盒检测caspase-1活性。该体外试验使用荧光抑制剂探针…

[附源码]计算机毕业设计JAVA音乐网站

[附源码]计算机毕业设计JAVA音乐网站 项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven…

一步登顶还是步步维艰?Java 资深架构师撰下的“阿里 P7 成神之路”

很多刚接触到 Java 开发的程序员都以为 Java 资深开发工程师就已经是 Java 开发的顶了,或者是不清楚架构师是干什么的。 举个例子说吧: 房屋建造。 架构师们根据房屋造型的需求设计出适合的构造,然后再反复测算这个框架搭建的可行性&#…

C++文件操作

文章目录计算机文件到底是什么(通俗易懂)?C文件类(文件流类)及用法详解C open 打开文件(含打开模式一览表)使用 open 函数打开文件使用流类的构造函数打开文件文本打开方式和二进制打开方式的区…

Jetson nano 系统安装

ContentsJetson Nano在 EMMC 上安装镜像U 盘启动和 TF 卡启动U 盘启动 (复制 eMMC 上系统)TF 卡启动设置远程登录系统SDK 安装使用 SDK Manager 安装使用指令安装Linux 操作基础文件传输、系统备份风扇配置IMX219-83 Stereo CameraAI 环境搭建PIP3 安装安装机器学习领域重要的安…

MOSFET 和 IGBT 栅极驱动器电路的基本原理学习笔记(二)栅极驱动参考

栅极驱动参考 1.PWM直接驱动 2.双极Totem-Pole驱动器 3.MOSFET Totem-Pole驱动器 4.速度增强电路 5.dv/dt保护 1.PWM直接驱动 在电源应用中,驱动主开关晶体管栅极的最简单方法是利用 PWM 控制其直接控制栅极,如 图 8 所示。 直接栅极驱动最艰巨的任务…

5‘-二磷酸鸟嘌呤核苷-岩藻糖二钠盐,GDP-Fucose,15839-70-0

中文名 5-二磷酸鸟嘌呤核苷-岩藻糖二钠盐 英文名 Guanosine 5′-diphospho-β-L-fucose sodium salt 英文别名 [(2R,3S,4R,5R)-5-(2-Amino-6-oxo-1,6-dihydro-9H-purin-9-yl)-3,4-dihydroxytetrahydro-2-furanyl]methyl (3S,4R,5S,6S)-3,4,5-trihydroxy-6-methyltetrahydro-2…

Linux Podman安装DVWA靶场环境

一、DVWA靶场环境简介 1.DVWA一个用来进行安全脆弱性鉴定的PHP/MySQL Web应用,旨在为安全专业人员测试自己的专业技能和工具提供合法的环境,帮助web开发者更好的理解web应用安全防范的过程。 ​ 2.DVWA 一共包含了十个攻击模块,分别是&#…

Unity + Mirror实现原创卡牌游戏局域网联机

资源下载地址 局域网联机插件 Mirror:Mirror | 网络 | Unity Asset Store 本地客户端测试多人游戏(不用打包)插件 : ParrelSync Mirror官方文档:General - Mirror (gitbook.io) Mirror使用 前置准备 导入Mirror …

UNet 网络做图像分割DRIVE数据集

目录 1. 介绍 2. 搭建 UNet 网络 3. dataset 数据加载 4. train 训练网络 5. predict 分割图像 6. show 7. 完整代码 1. 介绍 项目的目录如下所示 DRIVE 存放的是数据集predict 是待分割的图像result 里面放分割predict 的结果dataset 是处理数据的文件、model存放une…

day5_redis学习

文章目录秒杀优化阻塞队列实现消息队列Redis实现消息队列List实现消息队列PubSub实现消息队列Stream实现消息队列发布以及查看探店笔记点赞以及点赞排行榜秒杀优化 上面的过程中,我们进行秒杀操作的基本步骤为: 所以这时候整个过程就耗费较长的时间,因…

【1687. 从仓库到码头运输箱子】

来源:力扣(LeetCode) 描述: 你有一辆货运卡车,你需要用这一辆车把一些箱子从仓库运送到码头。这辆卡车每次运输有 箱子数目的限制 和 总重量的限制 。 给你一个箱子数组 boxes 和三个整数 portsCount, maxBoxes 和 m…

python大数据毕业设计选题题目大全

文章目录0 前言1 大数据相关题目2 开题指导2.1 起因2.2 如何避坑(重中之重)2.3 为什么这么说呢?2.4 难度把控2.5 题目名称3 最后0 前言 这是学长亲手整理的,大数据毕设选题系列第二篇,都是经过学长精心审核的题目,适合作为毕设&a…