Shell脚本 2

一、变量

变量来源于数学,是计算机语言中能储存计算结果或能表示值的抽象概念。

保存将来会变化的数据,即使数据变化,直接调用变量即可,各种 Shell 环境中都使用到了“变量”的概念。Shell 变量用来存放系统和用户需要使用的特定参数(值),而且这些参数可以根据用户的设定或系统环境的变化而相应变化。通过使用变量,Shell 程序能够提供更加灵活的功能,适应性更强。

3.1变量基础

常见shell变量的类型包括:

自定义变量:由用户自己定义,修改和使用
预定义变量:Bash中内置的一类变量    shell           不能修改    规定好的变量 放在那里让你使用


环境变量:由系统维护,用于设置工作环境      当前目录  当前主机名啊   $PATH     
只读变量:只可以读取不可以更改              只能不能修改    常量   
位置变量:通过命令行给脚本传递参数
 

系统内置变量:PATH,UID,HOSTNAME,USER   

3.1.1命名要求

- 区分大小写

- 不能使程序中的保留字和内置变量:如:if, for,hostname   命令  a=   

- 只能使用数字、字母及下划线,且不能以数字开头,注意:不支持短横线 “ - ”,和主机名相反    

- 不要使用内置的变量,使用英文尽量使用词义通俗易懂,PATH              

- 大驼峰 StudentFirstName 

- 小驼峰 studentFirstName 

- 下划线 student_name

name='value' 
变量名=变量值
直接字串:name='root'
变量引用:name="$USER"
命令引用:name=`COMMAND` 或者 name=$(COMMAND)
注意:变量赋值是临时生效,当退出终端后,变量会自动删除,无法持久保存,脚本中的变量会随着脚本结束,也会自动删除

变量引用:
$name
${name}

{}
弱引用和强引用
"$name " 弱引用,其中的变量引用会被替换为变量值
'$name' 强引用,其中的变量引用不会被替换为变量值,而保持原字符串

``$()


[root@localhost opt]# producet=kgc
[root@localhost opt]# echo $producet 
kgc
[root@localhost opt]# version=6.0
[root@localhost opt]# echo $producet$version
kgc6.0
[root@localhost opt]# echo "$producet$version"
kgc6.0
[root@localhost opt]# echo '$producet$version'
$producet$version
[root@localhost opt]# echo $producet6.0
.0
[root@localhost opt]# echo ${producet}6.0
kgc6.0
[root@localhost opt]# echo ${producet}$version
kgc6.0


[root@node2 ~]#name=xiaoming
[root@node2 ~]#title=cto
[root@node2 ~]#echo $title_$name
xiaoming


[root@localhost ~]#echo ls
ls
[root@localhost ~]#echo $(ls)
abc.txt anaconda-ks.cfg initial-setup-ks.cfg 公共 模板 视频 图片 文档 下载 音乐 桌面
[root@localhost ~]#echo `ls`
abc.txt anaconda-ks.cfg initial-setup-ks.cfg 公共 模板 视频 图片 文档 下载 音乐 桌面

1.变量追加值

格式:变量名+=追加值

3.1.2 read   -p

从键盘输入的内容变成变量

3.1.3变量作用范围

默认情况下,新定义的变量只在当前的shell环境中有效,因此称为局部变量,当进入子程序或新的shell环境中,局部变量将无法再起作用。

可以通过内部命令export将指定的变量为全局变量,使用户定义的变量在所子shell环境中可以继续使用

总结:export可以将指定的变量,变为全局变量

方法:

1. 格式1:export  变量名
2. 格式2:export  变量名=变量值

可以使用pstree 查看shell的环境

输入bash进入子shell

ctrl+D组合exit 退出子shell

也可以直接在定义变量的时候,加上export

3.1.4整数的运算expr

expr只能进行整数的运算

格式: expr 变量1 运算符 变量2 [运算符 变量3]

运算符:

加法  +

减法 -

乘法  \ *

除法  /

取余 (取模)% 

1.随机数生成器变量RANDOM

2.颜色

3.1.5系统各参数的脚本写入执行

3.1.6用户工作环境/etc/profile

3.17环境变量

1. 由系统提前创建,用来设置用户的工作环境
2. 可以使用env查看环境变量
3. 需要记住的常用环境变量

[root@localhost ftp]#env
#可以看到所有

$USER 表示用户名称

$HOME 表示用户的宿主目录

$LANG 表示语言和字符集

$PWD 表示当前所在工作目录

$PATH 表示可执行用户程序的默认路径

环境变量:

1.可以使子进程(包括孙子进程)继承父进程的变量,但是无法让父进程使用子进程的变量
2.一旦子进程修改从父进程继承的变量,将会新的值传递给孙子进程
3.一般只在系统配置文件中使用,在脚本中较少使用

3.1.8只读变量

变量值不允许修改(重新赋值)的情况

无<font color='red'>法使用 unset删除</font>

最快方法重启

[root@localhost opt]# name=ky15
[root@localhost opt]# readonly name
[root@localhost opt]# echo $name 
ky15
[root@localhost opt]# unset name
bash: unset: name: 无法反设定: 只读 variable
#只有退出进程
[root@localhost opt]# echo $name 
ky15
[root@localhost opt]# name=ky
bash: name: 只读变量

3.1.9位置变量

位置变量也称为位置参数,使用$1、$2、$3、…、$9 表示

注意:只能定义 1-9,如果想要10,用{10}###定义变量10的范围就行了

3.1.10预定义变量

bash   帮你定义好了  拿来用就可以了,你不需要知道为什么,记住

- $*:表示所有位置参数的内容看成一个整体返回      返回所有          
- $@:表示所有位置参数的内容分割成n份,每份作为一个独立的个体返回   返回所有  
- $?:表示前一条命令执行后的返回状态,返回值为 0 表示执行正确,返回任何非 0值均表示执行出现异常
- $#:表示命令行中位置参数的总个数
- $0:表示当前执行的脚本或程序的名称     当前脚本的名字
- $$:当前bash的进程id    
- $!:  后台任务最后一个id

1.$* 和 $@的区别

2.$#的含义

3.$0的含义

3.1.11 () {}

3.2测试

test###测试文件是否存在

-d:测试是否为目录(Directory)
-e:测试目录或文件是否存在(Exist)
-a:测试目录或文件是否存在(Exist)   
-f:测试是否为文件(File)
-r:测试当前用户是否有权限读取(Read)
-w:测试当前用户是否有权限写入(Write)
-x:测试当前用户是否有权限执行(eXcute)
-L: 测试是否为软连接文件

test -a###判断文件是否存在,存在返回0,有bug

test -e###判断文件是否存在,推荐使用这个

使用[   ]执行,与test一样

3.3比较整数数值

[  整数1  -操作符  整数2  ] 公式

- -eq:第一个数等于(Equal)第二个数
- -ne:第一个数不等于(Not Equal)第二个数
- -gt:第一个数大于(Greater Than)第二个数
- -lt:第一个数小于(Lesser Than)第二个数
- -le:第一个数小于或等于(Lesser or Equal)第二个数
- -ge:第一个数大于或等于(Greater or Equal)第二个数

判断磁盘使用量,是否小于80

3.4字符串比较

常用的测试操作符

=:字符串内容相同
!=:字符串内容不同,! 号表示相反的意思
-z:字符串内容为空
-n: 字符是否存在

格式 

[  字符串1 =  字符串2 ]  是否相同

[  字符串1  !=  字符串2 ]  是否不相同

[  -z  字符串 ]   是否为空

[  -n  字符串 ] 字符是否存在

3.5 逻辑测试 && 与 ||

&&  且

cmd1 成立  cmd2 成立  ,两个成立,结果才为真

cmd1   &&  cmd2

cmd1如果为假,cmd2就不会执行

||  或

cmd1   cmd2,有一个为真,结果就为真

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于JavaSwing+百度OCR开发的题库管理系统源码+数据库,能够将图片中的文字提取出来,保存题库中

题库管理系统 介绍 具备上传本地图片及截屏功能&#xff0c;并利用百度OCR技术&#xff0c;能够将图片中的文字提取出来&#xff0c;保存题库中&#xff0c;供以后查找。 技术方面&#xff0c;为制作exe可执行文件&#xff0c;该软件将JavaSwing,MybatisPlus,Spring三者进行集…

使用Python合并PPT文件

在日常工作和学习中&#xff0c;我们经常需要处理和管理大量的PPT文件。如果需要将多个PPT文件合并成一个文件&#xff0c;手动操作可能会非常繁琐和耗时。今天&#xff0c;我们将介绍如何使用Python编程语言和wxPython模块创建一个简单的GUI应用程序&#xff0c;来自动合并指定…

力扣精选算法100道——x的平方根(二分查找专题)

x的平方根 首先看到这个题目的时候&#xff0c;我们需要对上一个二分查找专题的题目进行深度理解&#xff0c;然后了解模板&#xff0c;这题是完全利用的上一题的模板知识进行&#xff0c;如果直接看这个题目可能是有点懵的&#xff0c;因为我这里直接利用模板进行解题。力扣…

架构篇14:高性能数据库集群-读写分离

文章目录 读写分离原理复制延迟分配机制小结高性能数据库集群的第一种方式是“读写分离”,其本质是将访问压力分散到集群中的多个节点,但是没有分散存储压力;第二种方式是“分库分表”,既可以分散访问压力,又可以分散存储压力。先来看看“读写分离”,下一篇我们再介绍“分…

函数递归的总结回顾

函数递归的本质就是其名字——递与归。先递出去&#xff0c; 再收回来。 而递归的思想就是为了让一个复杂的问题变成一个简单的问题 按照我目前的理解&#xff0c;函数递归有两点很重要。一个是它的限定条件&#xff0c;另一个就是函数体内“自调”&#xff08;就是自我调用语句…

ctfshow-命令执行(web53-web72)

目录 web53 web54 web55 web56 web57 web58 web59 web60 web61 web62 web63 web64 web65 web66 web67 web68 web69 web70 web71 web72 web53 …

微信小程序实现长按 识别图片二维码

第一种方案&#xff08;只需要在image里面加一个属性就可以了&#xff09; show-menu-by-longpress“{{true}}” <image show-menu-by-longpress"{{true}}" src"{{sysset.dyqewm}}" />第二种方案 放大预览图片&#xff0c;长按识别二维码 wxml <…

【GitHub项目推荐--一个简单的绘图应用程序(Rust + GTK4)】【转载】

一个用 Rust 和 GTK4 编写的简单的绘图应用程序来创建手写笔记。 Rnote 旨在成为一个简单但实用的笔记应用程序&#xff0c;用于手绘或注释图片或文档。它最终能够导入/导出各种媒体文件格式。而且输出的作品是基于矢量的&#xff0c;这使其在编辑和更改内容时非常灵活。 地址…

oracle古法unwrap手艺(oracle存储过程解码)

先说骚话 首先oracle官方是不支持解包的&#xff0c;见Doc ID 376303.1 但是需求来了。我就寄希望于民间大神的工具。很顺利&#xff0c;找到了几个&#xff0c;甚至还有网页版&#xff0c;以为是个easy money。 但是&#xff0c;我点背&#xff0c;总是能遇到精彩的情况。数…

C# .Net6搭建灵活的RestApi服务器

1、准备 C# .Net6后支持顶级语句&#xff0c;更简单的RestApi服务支持&#xff0c;可以快速搭建一个极为简洁的Web系统。推荐使用Visual Studio 2022&#xff0c;安装"ASP.NET 和Web开发"组件。 2、创建工程 关键步骤如下&#xff1a; 包添加了“Newtonsoft.Json”&…

ABAP SQL CDSView Entity中使用正则RegEx表达式(Regular Expressions)

1. 正则表达式测试程序 DEMO_REGEXDEMO_REGEX_TOY 2. ABAP SQL & CDSView Entity支持正则语法的场景 SQL函数语法作用执行逻辑返回类型CDS View EntitiesABAP SQLLIKE_REGEXPRLIKE_REGEXPR( PCRE pcre, VALUE sql_exp1[, CASE_SENSIT…

AWS CodeArtifact配置(Maven私有库)

问题 由于后台Java代码需要&#xff0c;发布jar到maven私有库后&#xff0c;另外一个Java项目&#xff0c;通过maven私有库再拉去这个jar使用。这里就需要部署一个maven私有库。 1. 创建域 打开CodeArtifact主页&#xff0c;开始创建域&#xff0c;如下图&#xff1a; 创建…

剧本杀小程序开发:探索游戏与科技的完美结合

随着科技的飞速发展&#xff0c;越来越多的人开始寻求数字化娱乐方式。剧本杀小程序正是这种需求下的产物&#xff0c;它将传统的剧本杀游戏与现代科技相结合&#xff0c;为玩家提供了全新的游戏体验。本文将探讨剧本杀小程序开发的各个方面&#xff0c;包括市场需求、功能设计…

鸿蒙5.0发布时间已定!何处寻得移动开发加速器?

直接在百度上搜索「鸿蒙5.0发布时间」&#xff0c;出来的结果&#xff0c;那一个比一个焦虑~~ 百度的AI基于综合内容判断得出&#xff0c;鸿蒙5.0的发布时间在2023-04-17 百度知道推的答案是202年年4月中 但不管几月&#xff0c;“鸿蒙元年”似乎都是确定的&#xff0c;就是…

大数据学习之Flink算子、了解DataStream API(基础篇一)

DataStream API &#xff08;基础篇&#xff09; 注&#xff1a; 本文只涉及DataStream 原因&#xff1a;随着大数据和流式计算需求的增长&#xff0c;处理实时数据流变得越来越重要。因此&#xff0c;DataStream由于其处理实时数据流的特性和能力&#xff0c;逐渐替代了DataSe…

copilot和chatGPT的区别

区别&#xff1a; Copilot和ChatGPT是由OpenAI开发的两个不同的工具&#xff0c;用于不同的任务和场景。以下是它们的主要区别&#xff1a; 用途&#xff1a; ChatGPT&#xff1a; ChatGPT是一个生成式语言模型&#xff0c;设计用于与用户进行自然语言交互。它被训练用于回答用…

innodb底层原理和MySQL日志机制

server层 1. 连接器 客户端连接数据库需要输入账号、密码。连接器进行校验账号密码以及权限。 2. 查询缓存 连接器连接以后&#xff0c;比如输入一个select语句&#xff0c;这时候第一步就会先根据sql语句作为key给查询缓存中查看这条sql有没有已经被查询过&#xff0c;如果…

基于Guava布隆过滤器的海量字符串高效去重实践

在Java环境中处理海量字符串去重的问题时&#xff0c;布隆过滤器&#xff08;BloomFilter&#xff09;是一种非常高效的数据结构&#xff0c;尽管它有一定的误报率。布隆过滤器适用于那些可以接受一定误报率&#xff0c;并且希望节省空间和时间成本的场景。 布隆过滤器应用 使…

爬取的数据可以入表吗?怎样入表?

合规是数据入表的前提。当前爬虫数据是非常敏感的&#xff0c;因为爬虫极容易造成两大不合规的问题&#xff1a;一是没有经过个人同意获取数据&#xff0c;二是爬取的数据里可能含有个人敏感信息也是一个问题。现在法律对于这部分非常严苛&#xff0c;如果企业里有50条未获得授…

优先级队列(堆)详解

优先级队列&#xff08;堆&#xff09;详解 目录 堆的概念堆的存储方式堆的基本操作优先级队列模拟实现PriorityQueue接口介绍堆排序Top-k问题 1、堆的概念 如果有一个关键码的集合K {k0&#xff0c;k1&#xff0c; k2&#xff0c;…&#xff0c;kn-1}&#xff0c;把它的所…