Linux之Shell编程
shell是什么
shell是一个命令行解释器,他为用户提供一个向linux内核发送请求以便运行程序的界面系统级程序,用户可以用shell来启动,挂起,停止甚至编写一些程序。
shell脚本的执行方式
脚本格式要求
- 脚本以
#!/bin/bash
开头 - 脚本需要有执行权限
编写第一个shell脚本
vim hello.sh
#!/bin/bash
echo "hello,shell"
执行脚本
- 给
hello.sh
赋予执行权限 - 使用相对路径执行脚本
./hello.sh
,或者使用绝对路径执行脚本./home/shcode/hello.sh
,或者使用sh hello.sh
也可以使用绝对路径。
shell变量
linux shell中的变量可以分为系统变量和用户自定义变量
系统变量:$HOME, $PWD, $SHELL, $USER等等,比如 echo $SHELL
显示当前shell中的所有变量:set
shell变量的定义
语法
- 定义变量:变量名=值
- 撤销变量:unset 变量
- 声明静态变量:readonly 变量
静态变量无法unset
#!/bin/bash
# 定义变量A
A=100
#输出变量需要使用$
echo A=$A
echo "A=$A"
# 撤销变量A
unset A
echo "A=$A"
# 声明静态变量B=2,不能unset
readonly B=2
echo "B=$B"
#unset B
# 将指令的结果赋给变量,使用``或者$()
C=`date`
D=$(date)
echo "C=$C"
echo "D=$D"
# 使用环境变量 SHELL
echo "shell=$SHELL"
vim中多行注解
:<<!
xxx
...
!
定义变量的规范
- 变量名称可以由字母,数字和下划线组成,但是不能以数字开头。
- 等号两侧不能由空格
- 变量名一般习惯大写
设置环境变量
- vim /etc/profile
- export 变量名=变量值 (将shell变量输出为环境变量/全局变量)
- source 配置文件 (让修改后的配置信息生效)
- echo $变量名
在/etc/profile文件中定义TOMCAT_HOME环境变量
位置参数变量
当我们执行一个shell脚本时,如果希望获取到命令行的参数信息,就可以使用到位置参数变量。例如./myshell.sh 100 200
这个就是一个执行shell的命令行,可以在myshell脚本中获取到参数消息(100和200)。
语法
- $n:n为数字,$0表示命令本身,$1- 9 表示第一到第九个参数,十以上的参数需要使用大括号包含, 9表示第一到第九个参数,十以上的参数需要使用大括号包含, 9表示第一到第九个参数,十以上的参数需要使用大括号包含,{10}
- $*:代表命令行中所有参数,把所有的参数看成一个整体
- @ :也代表命令行中所有参数,不过 @:也代表命令行中所有参数,不过 @:也代表命令行中所有参数,不过@把每个参数区分对待
- $#:代表命令行中所有参数的个数
#!/bin/bash
echo "0=$0, 1=$1,2=$2"
echo "所有的参数=$*"
echo "$@"
echo "参数个数=$#"
预定义变量
就是shell设计者事先已经定义好的变量,可以直接在shell脚本中使用。
语法
- $$:表示当前进程的进程号
- $!:后台运行的最后一个进程的进程号
- $?:最后一次执行的命令的返回状态,如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值非0,则证明上一个命令执行不正确。
#!/bin/bash
echo "当前进程的进程号id=$$"
# 以后台的方式运行一个脚本,并获取他的进程号
/home/shcode/hello.sh &
echo "最后一个后台方式运行的进程id=$!"
echo "执行的结果是=$?"
运算符
语法
- $((运算式)) 或 $[运算式] 或 expr m + n
- 注意expr运算符间要有空格,如果希望将expr结果赋给某个变量,使用``
- expr m - n
- expr *, /, % (乘,除,求余)
案例
#!/bin/bash
# 案例1:计算(2+3)* 4
# 使用第一种方式
RES1=$(((2 + 3)*4))
echo "res1=$RES1"
# 使用方式2,推荐使用
RES2=$[(2+3)*4]
echo "res2=$RES2"
# 使用方式3 expr
TEMP=`expr 2 + 3 `
RES4=`expr $TEMP \* 4`
echo "temp=$TEMP"
echo "res4=$RES4"
# 案例2:求命令行的两个参数的和 20 50
SUM=$[$1+$2]
echo "sum=$SUM"
流程控制
判断语句
语法
[ condition ]
注意condition前后要有空格,非空返回true, 可以使用$?验证(0为true,>1 为fasle)
判断语句:
- = 字符串比较
- 整数比较
- -lt 小于
- -le 小于等于 little equal
- -eq 等于
- -gt 大于
- -ge 大于等于
- -ne 不等于
- 按照文件权限比较
- -r 有读权限
- -w 有写权限
- -x 有执行权限
- 按文件类型比较
- -f 文件存在且是常规文件
- -e 文件存储
- -d 文件存在且是目录
案例
#!/bin/bash
# 案例1:字符串是否相等
if [ "ok" = "ok" ]
thenecho "equal"
fi
# 案例2:23是否大于等于22
if [ 23 -gt 22 ]
thenecho "大于"
fi
# 案例3:/home/shcode/oper.sh 文件是否存在
if [ -f /home/shcode/oper.sh ]
thenecho "存在"
fi
#案例4:条件不为空
if [ root ]
thenecho "root"
fi
if判断
语法
if [ condition ]
then语句块
fi
# 或,多分支
if [ condition ]
then语句块
elif [ condition ]
then语句块
fi
案例
#!/bin/bash
# 如果输入的参数大于等于60输出“及格了”否则输出“不及格”
if [ $1 -ge 60 ]
thenecho "及格了"
elif [ $1 -lt 60 ]
thenecho "不及格"
fi
case语句
语法
case $变量名 in
"值1")
语句块
;;
"值2")
语句块
;;
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac
案例
#!/bin/bash
# 当命令行参数为1,输出周一,是2输出周二,其他情况输出other
case $1 in
"1")
echo "周一"
;;
"2")
echo "周二"
;;
*)
echo "other"
;;
esac
for循环
语法
for (( 初始值; 循环控制条件; 变量变化))
do代码
done
案例
#!/bin/bash
# 打印命令行输入的参数
# $*是把输入的参数,当做一个整体,所以只会输出一句
for i in "$*"
doecho "num is $i"
done
# $@获取输入的参数,是分开处理的
for j in "$@"
doecho "num is $j"
done
#!/bin/bash
SUM=0
for(( i=1; i<=$1; i++))
doSUM=$[$SUM+$i]
done
echo "SUM=$SUM"
while循环
语法
while [ condition ]
do
代码块
done
案例
#!/bin/bash
# 求1到n的值
SUM=0
i=0
while [ $i -le $1 ]
doSUM=$[$SUM+$i]i=$[$i+1]
done
echo "SUM=$SUM"
read读取控制台输入
语法
read (选项)(参数)
选项:
- -p:指定读取值时的提示符
- -t:指定读取值时等待的时间(秒),如果没有在指定的时间内输入,就不再等待。
参数:
- 指定读取值的变量名
案例
#!/bin/bash
# 案例1:读取控制台输入的num1
read -p "请输入一个数NUM1=" NUM1
echo "你输入的NUM1="$NUM1
# 案例2:读取控制台输入的NUM2值,在10s内输入
read -t 10 -p "请输入一个数NUM2=" NUM2
echo "你输入的NUM2="$NUM2
函数
shell中既有系统函数也有自定义函数
系统函数
语法
basename [pathname] [suffix]
功能:返回完整路径最后/的部分,常用于获取文件名
dirname 文件绝对路径
自定义函数
语法
function functionName() {Action;[return int;]
}
案例
#!/bin/bash
# 案例1:计算输入两个参数的和
function getSum() {SUM=$[$n1+$n2]echo "和是=$SUM"
}
# 输入两个值
read -p "请输入一个数n1=" n1read -p "请输入一个数n2=" n2
# 调用自定义函数
getSum $n1 $n2
相关文章:

Linux之Shell编程
shell是什么 shell是一个命令行解释器,他为用户提供一个向linux内核发送请求以便运行程序的界面系统级程序,用户可以用shell来启动,挂起,停止甚至编写一些程序。 shell脚本的执行方式 脚本格式要求 脚本以#!/bin/bash开头脚本需…...

Unity组件开发--传送点
本组件仅实现A传送点到B传送的功能,是可以双向传送的,如果只要单向传送,可以另外改脚本实现; 先看效果: unity组件传送点演示 1.传送组件shader是怎么写的:这种效果的实现方案 shader编辑器是这样的&#…...

vue结合Cesium加载gltf模型
Cesium支持什么格式? Cesium支持的格式包括:3D模型格式(如COLLADA、gITF、OBJ)、影像格式(如JPEG、PNG、GeoTIFF)、地形格式(如STL、Heightmap)、矢量数据格式(如GeoJSON…...

逆置算法和数组循环移动算法
元素逆置 概述:其实就是将 第一个元素和最后一个元素交换,第二个元素和倒数第二个元素交换,依次到中间位置。用途:可用于数组的移动,字符串反转,链表反转操作,栈和队列反转等操作。 逆置图解 …...
【MATLAB】数豆子
Matlab数豆子 创建一个变量来表示豆子的数量。例如,可以使用豆子数量 100;来表示有100颗豆子。 使用disp函数打印出豆子的数量。例如,可以使用disp([目前有 num2str(豆子数量) 颗豆子])来打印出当前豆子的数量。 进行豆子的计数操作。例如,…...
QT C++中调用python脚本时,import第三方库失败问题解决
QT C中调用python脚本时,import第三方库失败问题解决 文章目录 QT C中调用python脚本时,import第三方库失败问题解决前言一、问题复现二、调试过程三、问题解决1 numpy问题解决2 matplotlib问题解决 四、补充说明五、参考资料 前言 项目需要,…...

【AI视野·今日Robot 机器人论文速览 第七十期】Thu, 4 Jan 2024
AI视野今日CS.Robotics 机器人学论文速览 Thu, 4 Jan 2024 Totally 17 papers 👉上期速览✈更多精彩请移步主页 Daily Robotics Papers Many-Objective-Optimized Semi-Automated Robotic Disassembly Sequences Authors Takuya Kiyokawa, Kensuke Harada, Weiwei …...
Flutter中的布局组件介绍及使用
1. 引言 Flutter 是一款由 Google 开发的开源 UI 软件开发工具,可用于在单个代码库中构建漂亮、本机编译的应用程序。在 Flutter 中,布局是构建用户界面的核心部分之一。本文将介绍 Flutter 中的全部布局组件,以及它们的使用方式。 2. 基础…...

【面试高频算法解析】算法练习2 回溯(Backtracking)
前言 本专栏旨在通过分类学习算法,使您能够牢固掌握不同算法的理论要点。通过策略性地练习精选的经典题目,帮助您深度理解每种算法,避免出现刷了很多算法题,还是一知半解的状态 专栏导航 二分查找回溯(Backtracking&…...

认识Git
🌎初识Git 初识Git 什么是Git Git的安装 Centos平台安装Git Ubuntu平台安装Git Git的基本操作 创建远程仓库 配置Git 认识工作区、暂存区与版本库 添加文件到暂存区 将暂存区文件提交至本…...
@RequestParam,@RequestBody和@PathVariable 区别
RequestParam,RequestBody和PathVariable 这三者是spring常见的接受前端数据的注解,那么他们分别是接受什么的前端数据呢? RequestParam:这个注解主要用于处理请求参数,尤其是GET请求中的查询参数和表单参数。它可以用…...

vue3组件传参
1、props: 2、自定义事件子传父 3、mitt任意组件通讯 4、v-model通讯(v-model绑定在组件上) (1)V2中父子组件的v-model通信,限制了popos接收的属性名必须为value和emit触发的事件名必须为input,所以有时会有冲突; 父组件: 子组件: (2)V3中:限制了popos接收的属性名…...
React16源码: React中创建更新的方式及ReactDOM.render的源码实现
React当中创建更新的主要方式 ReactDOM.render || hydrate 这两个API都是我们要把整个应用第一次进行渲染到我们的页面上面能够展现出来我们整个应用的样子的一个过程这是初次渲染 setState 后续更新应用 forceUpdate 后续更新应用 replaceState 在后续被舍弃 关于 ReactDOM…...
CentOS 7 系列默认的网卡接口名称
CentOS 7 系列默认的网卡接口是随机的,如果要修改网卡名称以 eth 开头,有两种方式。 方法一:安装系统时 在安装界面移动光标到 Install Centos 7.按 TAB 键 在出现的代码的末尾添加:net.ifnames0 biosdevname0.按下回车开始安装即…...
多文件上传
HTML中实现多文件上传是通过用<input type"file">元素的multiple属性,以下简单描述多文件上传的步骤 HTML表单准备,使用<input type"file">元素,并为其添加multiple属性,以允许用户选择多个文件…...
2024.1.7力扣每日一题——赎金信
2024.1.7 题目来源我的题解方法一 哈希表方法二 数组 题目来源 力扣每日一题;题序:383 我的题解 方法一 哈希表 使用哈希表记录ransomNote中所需字符的数量,然后遍历magazine并将哈希表中存在的对应的数量减一 时间复杂度:O(nm…...

C#中List<T>底层原理剖析
C#中List底层原理剖析 1. 基础用法2. List的Capacity与Count:3.List的底层原理3.1. 构造3.2 Add()接口3.3 Remove()接口3.4 Inster()接口3.5 Clear()接口3.6 Contains()接口3.7 ToArray()接口3.8 Find()接口3.8 Sort()接口 4. 总结5. 参考 1. 基础用法 list.Max() …...
Leetcode 3003. Maximize the Number of Partitions After Operations
Leetcode 3003. Maximize the Number of Partitions After Operations 1. 解题思路2. 代码实现 题目链接:10038. Maximize the Number of Partitions After Operations 1. 解题思路 这一题我看实际比赛当中只有72个人做出来,把我吓得够呛,…...
MySQL第一讲:MySQL知识体系详解(P6精通)
MySQL知识体系详解(P6精通) MySQL不论在实践还是面试中,都是频率最高的。本系列主要对MySQL知识体系梳理,将给大家构建JVM核心知识点全局知识体系,本文是MySQL第一讲,MySQL知识体系详解。 文章目录 MySQL知识体系详解(P6精通)1、MySQL学习建议1.1、为什么学习 MySQL?1.2、…...

逻辑回归简单案例分析--鸢尾花数据集
文章目录 1. IRIS数据集介绍2. 具体步骤2.1 手动将数据转化为numpy矩阵2.1.1 从csv文件数据构建Numpy数据2.1.2 模型的搭建与训练2.1.3 分类器评估2.1.4 分类器的分类报告总结2.1.5 用交叉验证(Cross Validation)来验证分类器性能2.1.6 完整代码…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...

中医有效性探讨
文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...

iview框架主题色的应用
1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题,无需引入,直接可…...

Unity VR/MR开发-VR开发与传统3D开发的差异
视频讲解链接:【XR马斯维】VR/MR开发与传统3D开发的差异【UnityVR/MR开发教程--入门】_哔哩哔哩_bilibili...