当前位置: 首页 > news >正文

Day 32 shell变量及运算

一:变量概述

1.什么是变量

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

​ 变量可以通过变量名访问,在指令式语言中,变量通常是可变的;在某些条件下也是不可变的

2.变量的规则

​ 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头

​ 中间不能有空格,可以使用下划线

​ 不能使用标点符号

​ 不能使用bash里的关键字

二:变量分类

1.自定义变量

​ 定义变量:变量名=变量值 例如:xingdian=123

​ 引用变量:$变量名 或 ${变量名}

​ 查看变量:echo $变量名

​ 取消变量:unset 变量名

​ 作用范围:仅在当前shell中有效,所以切换另一个终端会导致变量失效

2.环境变量

​ 定义环境变量:

​ 方法一: export back_dir2=/home/backup

​ 方法二 :先给自定义变量back_dir1赋值,然后export back_dir1 将自定义变量转换成环境变量

​ 引用环境变量:$变量名 或 ${变量名}

​ 查看环境变量:echo $变量名

​ 取消环境变量:unset 变量名

​ 变量作用范围:在当前shell和子shell有效

注意:

​ 环境变量拥有可继承性:export之后就拥有继承性

​ 永久生效:写到环境变量脚本,/etc/profile ~/.baserc ~/.bash_profile /etc/bashrc

案例:

[root@xingdiancloud ~]# vim /etc/profile  
JAVA_HOME=/usr/local/java
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME PATH
[root@xingdiancloud ~]# vim ~/.bash_profile (只显示部分)
PATH=$PATH:$HOME/bin:/usr/local/mycat/bin

/etc/profile:针对于系统的环境变量,对所有用户生效

​ 这是系统最主要的shell设置文件,也是用户登陆时系统最先检查的文件,有关重要的环境变量都定义在此,其中包括PATH,USER,LOGNAME,MAIL,HOSTNAME,HISTSIZE,INPUTRC等。而在文件的最后,它会检查并执行/etc/profile.d/*.sh的脚本

~/.bash_profile:针对于用户的环境变量,只对当前登录用户生效

​ 这个文件是每位用户的bash环境设置文件,它存在与于用户的主目录中,当系统执行/etc/profile 后,就会接着读取此文件内的设置值。在此文件中会定义USERNAME,BASH_ENV和PATH等环境变量,但是此处PATH除了包含系统的$PATH变量外加入用户的“bin”目录路径

~/.bashrc

​ 接下来系统会检查~.bashrc文件,这个文件和前两个文件(/etc/profile 和.bash_profile)最大的不同是,每次执行bash时,.bashrc都会被再次读取,也就是变量会再次地设置,而/etc/profile,./bash_profile只有在登陆时才读取。就是因为要经常的读取,所以**/.bashrc文件只定义一些终端机设置以及shell提示符号等功能**,而不是定义环境变量

~/.bash_login

​ .bash_login默认不存在,**但如果/.bash_profile文件不存在,则系统会转而读取/.bash_login这个文件内容。**这是用户的登陆文件,在每次用户登陆系统时,bash都会读此内容,所以通常都会将登陆后必须执行的命令放在这个文件中

.profile

​ 如果~./bash_profile ./bash_login两个文件都不存在,则会使用这个文件的设置内容,其实它的功能与/.bash_profile相同

.bash_logout

​ 如果想在注销shell前执行一些工作,都可以在此文件中设置

[root@xingdiancloud ~]# vi ~.bash_logout
clear
仅执行一个clear命令在你注销的时候

~/.bash_history

​ 这个文件会记录用户先前使用的历史命令

注意:

​ 在/etc/profile.d建立独立的环境变量配置文件

​ 常用环境变量:USER UID HOME HOSTNAME PWD PATH

​ PATH:这个变量存放的是所有命令所在的路径 修改:PATH=$PATH:+目录

3.位置变量

$1 $2 $3 $4 $5 $6 $7 $8 $9 $10

位置变量并不会在脚本中进行赋值,而是在执行脚本时对其进行赋值

格式:

bash 含有位置变量的脚本文件 $1的赋值 $2的赋值 $3的赋值 …

案例:

[root@xingdiancloud sh]# cat xingdian.sh
#!/bin/bash
echo "hello $1"
[root@xingdiancloud sh]# bash xingdian.sh xingdian
hello xingdian
4.预定义变量
$0  脚本名
$*	所有的参数
$@ 	所有的参数
$# 	参数的个数
$$ 	当前进程的PID
$!  上一个后台进程的PID
$?	上一个命令的返回值,0表示成功,1表示失败
$USER 当前登录用户的用户名
$HOME 当前用户的家目录
$PATH 命令搜索路径,由冒号分割的目录列表组成
$UID 当前用户的UID
$HOSTNAME 当前主机名

案例:

[root@xingdiancloud sh]# cat test.sh
#!/bin/bash
echo "第2个位置参数是$2"
echo "第1个位置参数是$1"
echo "第4个位置参数是$4"echo "所有参数是: $*"
echo "所有参数是: $@"
echo "参数的个数是: $#"
echo "当前进程的PID是: $$"echo '$1='$1
echo '$2='$2
echo '$3='$3
echo '$*='$*
echo '$@='$@
echo '$#='$#
echo '$$='$$

三:变量赋值

1.显示赋值

​ 变量名=变量值

示例:

[root@xingdiancloud ~]# ip1=192.168.1.251
[root@xingdiancloud ~]# school="BeiJing 1000phone"
[root@xingdiancloud ~]# today1=`date +%F`
[root@xingdiancloud ~]# today2=$(date +%F)
变量中引用涉及到命令时使用两个反引号``或者$(),两者等价
2.键盘读入
read 变量名
read -p "提示信息: "  变量名
read -t 5 -p "提示信息: "  变量名  -t 后面跟秒数,定义输入字符的等待时间
read -n 2 变量名   -n 后跟一个数字,定义输入文本的长度,很实用。

案例1:

[root@xingdiancloud ~]# vim first.sh
back_dir1=/var/backup
read -p "请输入你的备份目录: " back_dir2
echo $back_dir1
echo $back_dir2
[root@xingdiancloud ~]# sh first.sh

案例2:

[root@xingdiancloud ~]# vim ping2.sh
#!/bin/bash							
read -p "Input IP: " ip                
ping -c2 $ip &>/dev/null		
if [ $? = 0 ];then					echo "host $ip is ok"	    
else											echo "host $ip is fail"	    
fi											
[root@xingdiancloud ~]# chmod a+x ping2.sh
[root@xingdiancloud ~]# ./ping.sh

注意:定义或引用变量时注意事项

​ " " 弱引用 可以实现变量和命令的替换

​ ’ ’ 强引用 不完成变量替换

​ `` 反引命令替换 等价于 $() 反引号中的shell命令会被先执行

[root@xingdiancloud ~]# school=1000phone
[root@xingdiancloud ~]# echo "${school} is good"
1000phone is good
[root@xingdiancloud ~]# echo '${school} is good'
${school} is good
[root@xingdiancloud ~]# touch `date +%F`_file1.txt  
[root@xingdiancloud ~]# touch $(date +%F)_file2.txt 
[root@xingdiancloud ~]# disk_free3="df -Ph |grep '/$' |awk '{print $4}'"	错误
[root@xingdiancloud ~]# disk_free4=$(df -Ph |grep '/$' |awk '{print $4}')
[root@xingdiancloud ~]# disk_free5=`df -Ph |grep '/$' |awk '{print $4}

四:变量运算

1.整数运算

方法一:expr

运算符和变量之间有空格

[root@xingdiancloud ~]# expr 1 + 2
[root@xingdiancloud ~]# expr $num1 + $num2    			+  -  \*  /  %

方法二:$(())

[root@xingdiancloud ~]# echo $(($num1+$num2))      	+  -  *  /   %
[root@xingdiancloud ~]# echo $((num1+num2))
[root@xingdiancloud ~]# echo $((5-3*2))	 
[root@xingdiancloud ~]# echo $(((5-3)*2))
[root@xingdiancloud ~]# echo $((2**3))
[root@xingdiancloud ~]# sum=$((1+2)); echo $sum

方法三:$[]

[root@xingdiancloud ~]# echo $[5+2]						         +  -  *  /  %
[root@xingdiancloud ~]# echo $[5**2]

方法四:let

[root@xingdiancloud ~]# let sum=2+3; echo $sum
[root@xingdiancloud ~]# let i++; echo $i
2.小数运算

​ 通过echo将值传给bc,使用bc做小数运算,scale指定小数点位数

加法运算(scale参数无效)

[root@xingdiancloud ~]# echo "5.999 + 5.001"|bc
6.000
[root@xingdiancloud ~]# echo "5.111+ 5.1114"|bc
10.2224

减法运算(scale参数无效)

[root@xingdiancloud ~]# echo "2.22 - 1.11"|bc
1.11

乘法运算

[root@xingdiancloud ~]# echo "5.12 * 5.6000"|bc
28.6720

注意:乘积小数点位数默认以乘数中小数点位数最多的为准(不指定scale参数)

除法运算

[root@xingdiancloud ~]# echo "scale=2;9.898 / 1.11"|bc
8.91
[root@xingdiancloud ~]# echo "9.898 / 1.11"|bc
8

五:扩展

1.内容的删除

统计变量长度:${#变量名}

标准查看:${变量名}

从前往后进行最短匹配,并删除匹配内容:${变量名#*匹配字符}

从前往后进行最长匹配,并删除匹配内容:${变量名##*匹配字符}

从后往前进行最短匹配,并删除匹配内容:${变量名%匹配字符*}

从后往前进行最长匹配,并删除匹配内容:${变量名%%匹配字符*}

案例一

[root@xingdian ~]# url=www.sina.com.cn
[root@xingdian ~]# echo ${#url}			    统计变量值的长度15
[root@xingdian ~]# echo ${url}			    标准查看
www.sina.com.cn
[root@xingdian ~]# echo ${url#*.}		    从前往后,最短匹配
sina.com.cn
[root@xingdian ~]# echo ${url##*.}		    从前往后,最长匹配	贪婪匹配
cn
[root@xingdian ~]# url=www.sina.com.cn
[root@xingdian ~]# echo ${url#a.}
www.sina.com.cn
[root@xingdian ~]# echo ${url#*sina.}
com.cn

案例二

[root@xingdian ~]# url=www.sina.com.cn
[root@xingdian ~]# echo ${url}
www.sina.com.cn
[root@xingdian ~]# echo ${url%.*}		从后往前,最短匹配
www.sina.com
[root@xingdian ~]# echo ${url%%.*}	从后往前,最长匹配	贪婪匹配
www
[root@xingdian ~]# echo $HOSTNAME
xingdian.1000phone.com
[root@xingdian ~]# echo ${HOSTNAME%%.*}
xingdian
2.索引及切片
[root@xingdian ~]# echo ${url:0:5}  //从头开始,向后5个结束
[root@xingdian ~]# echo ${url:5:3}	//从第6个开始,向后3个结束
[root@xingdian ~]# echo ${url:5}    //从第6个开始,直到结尾
3.变量内容替换
[root@xingdian ~]# url=www.sina.com.cn
[root@xingdian ~]# echo ${url/sina/baidu}
www.baidu.com.cn
[root@xingdian ~]# url=www.sina.com.cn
[root@xingdian ~]# echo ${url/n/N}  //只替换匹配到的第一个
www.siNa.com.cn
[root@xingdian ~]# echo ${url//n/N}	//替换匹配到的所有,贪婪匹配
www.siNa.com.cN
4.自增运算

对变量的值的影响

[root@xingdian ~]# i=1
[root@xingdian ~]# let i++
[root@xingdian ~]# echo $i
2
[root@xingdian ~]# j=1
[root@xingdian ~]# let ++j
[root@xingdian ~]# echo $j
2

对表达式的值的影响

[root@xingdian ~]# unset i
[root@xingdian ~]# unset j
[root@xingdian ~]# 
[root@xingdian ~]# i=1
[root@xingdian ~]# j=1
[root@xingdian ~]# 
[root@xingdian ~]# let x=i++         先赋值,再运算
[root@xingdian ~]# let y=++j         先运算,再赋值
[root@xingdian ~]# 
[root@xingdian ~]# echo $i
2
[root@xingdian ~]# echo $j
2
[root@xingdian ~]# 
[root@xingdian ~]# echo $x
1
[root@xingdian ~]# echo $y
2

相关文章:

Day 32 shell变量及运算

一:变量概述 1.什么是变量 ​ 变量来源于数学,是计算机语言中能储存计算结果或能表示值的抽象概念 ​ 变量可以通过变量名访问,在指令式语言中,变量通常是可变的;在某些条件下也是不可变的 2.变量的规则 ​ 命名只…...

八、VUE内置指令

一、初识VUE 二、再识VUE-MVVM 三、VUE数据代理 四、VUE事件处理 五、VUE计算属性 六、Vue监视属性 七、VUE过滤器 七、VUE内置指令 九、VUE组件 v-text 向其所在的节点中渲染文本内容。 (纯文本渲染)与插值语法的区别:v-text会替换掉节点中的内容,{{x…...

学习笔记:IEEE 1003.13-2003【POSIX PSE53接口列表】

一、POSIX PSE53接口列表 根据IEEE 1003.13-2003,整理了POSIX PSE53接口API(一共126个),每个API支持链接查看。 IEEE POSIX接口online搜索链接: The Open Group Base Specifications Issue 7, 2018 edition 详细内…...

springboot logback 日志注入安全问题 统一处理

背景 日志注入一般指的是恶意用户输出换行等内容,混淆正常的日志,导致排查问题是无法正确定位问题,因此,我们需要对要打印的日志内容进行过滤。 但是,如果是每个接口单独处理的话,成本较高,因此…...

linux进阶高级配置,你需要知道的有哪些(13)-Squid代理服务器

1、squid代理的作用:缓存网页对象,减少重复请求 2、代理的基本类型 传统代理:适用于Internet互联网,需明确指定服务端(浏览器需要配置) 透明代理:适用于共享上网网关,不需要指定服务…...

SpringBoot自动装配(二)

近日,余溺于先贤古哲之文无法自拔。虽未明其中真意,但总觉有理。遂抄录一篇以供诸君品鉴——公孙鞅曰:“臣闻之:‘疑行无名,疑事无功。’君亟定变法之虑,殆无顾天下之议之也。且夫有高人之行者,…...

数据结构 顺序表1

1. 何为顺序表: 顺序表是一种线性数据结构,是由一组地址连续的存储单元依次存储数据元素的结构,通常采用数组来实现。顺序表的特点是可以随机存取其中的任何一个元素,并且支持在任意位置上进行插入和删除操作。在顺序表中&#xf…...

C++基础-编程练习题1

文章目录 一、哥德巴赫猜想二、哥德巴赫猜想2三、打印成绩单四、成绩输入输出五、数组输出奇数位偶数位 一、哥德巴赫猜想 【试题描述】 哥德巴赫提出了以下的猜想:任何一个大于 2 的偶数都可以表示成 2 个质数之和。 质数是指除了 1 和本身之外没有其他约数的数&a…...

四十九坊股权设计,白酒新零售分红制度,新零售策划机构

肆拾玖坊商业模式 | 白酒新零售体系 | 新零售系统开发 坐标:厦门,我是易创客肖琳 深耕社交新零售行业10年,主要提供新零售系统工具及顶层商业模式设计、全案策划运营陪跑等。 不花钱开3000多家门店,只靠49个男人用一套方法卖白酒…...

如何将公众号添加到CSDN个人主页

1. 创作中心- 推广管理 输入个人公众号名字并开启微信公众号推广 2. 将公众号的二维码图片加入拓展信息 个人主页的左下角就能看到推广 如果希望能看到是二维码 操作如下: 写篇文章贴上二维码 然后点击鼠标右键获得此页面链接 ,例如我的个人公众号 htt…...

64K方法数限制原理及解决方案

64K限制的原因 Android APK文件本质上是一个压缩文件,它包含的classes.dex文件是可执行的Dalvik字节码文件,这个.dex文件中存放的就是编译后的Java代码。Dalvik可执行文件规范限制了单个.dex文件最多引用的方法数是65536个。其中包含联网Android Framew…...

产品品牌CRUD

文章目录 1.renren-generator生成CRUD1.数据库表设计1.数据表设计2.分析 2.代码生成器生成crud1.查看generator.properties(不需要修改)2.修改application.yml 连接的数据库修改为云数据库3.启动renren-generator模块4.浏览器访问 http://localhost:81/5…...

惠普发布全新AI战略,重塑办公空间 引领企业智能化新浪潮

近日、全球知名科技公司惠普在北京隆重举办了以“用智能,开启无限可能”为主题的2024惠普商用AI战略暨AI PC新品发布会,此次盛会标志着惠普在人工智能领域迈出了重要一步,惠普紧跟时代步伐,推出了更高效、更安全、更灵活的AI PC产…...

python中的数据可视化:极坐标散点图

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 python中的数据可视化: 极坐标散点图 [太阳]选择题 关于以下代码输出结果的说法中正确的是? import matplotlib.pyplot as plt import numpy as np n 150 r 2 * np.r…...

5.12.1 Detecting and classifying lesions in mammograms with Deep Learning

计算机辅助检测 (CAD) 系统的开发是为了帮助放射科医生分析筛查性乳房 X 光检查,深度 CNN 有可能彻底改变医学图像分析。我们提出了一种基于最成功的对象检测框架之一 Faster R-CNN 的 CAD 系统。该系统无需任何人为干预即可检测乳房 X 光照片上的恶性或良性病变并对…...

Python爬虫——如何使用urllib的HTTP基本库

怎样通过 urllib库 发送 HTTP 请求? urllib库主要由四个模块组成: urllib.request 打开和读取 URLurllib.error 包含 urllib.request 抛出的异常urllib.parse 用于解析 URLurllib.robotparser 用于解析 robots.txt 文件 1. 使用urllib.parse解析URL 使用urlparse(…...

OceanBase v4.3特性解析:新功能“租户克隆”的场景与应用指南

熟悉或曾用过OceanBase的朋友,对于“多租户”这一理念定不陌生。OceanBase的租户概念,与我们熟知的传统数据库实例颇为相似。举例来说,OceanBase的租户支持MySQL兼容模式,对于用户而言,选用一个MySQL兼容模式的租户&am…...

RS3236-3.3YUTDN4功能和参数介绍及PDF资料

RS3236-3.3YUTDN4功能和参数介绍及PDF资料-公司新闻-配芯易-深圳市亚泰盈科电子有限公司 品牌: RUNIC(润石) 封装: XDFN-4-EP(1x1) 描述: 带过温保护 输出类型: 固定 最大输入电压: 7.5V 输出电压: 3.3V 最大输出电流: 500mA RS3236-3.3YUTDN4 是一款低压差线性稳压器&#x…...

Vue如何引入公用方法

文章目录 1. 在全局范围内引入2. 在单文件组件中引入3. 使用Vuex或Vue Composition API4. 使用mixins5. 使用插件 1. 在全局范围内引入 在你的main.js或main.ts文件中引入并注册你的公用方法,使得它们可以在整个Vue应用中使用。 // 引入你的公用方法文件 import {…...

Java面试题:ConcurrentHashMap

ConcurrentHashMap 一种线程安全的高效Map集合 jdk1.7之前 底层采用分段的数组链表实现 一个不可扩容的数组:segment[] 数组中的每个元素都对应一个HashEntry数组用以存放数据 当放入数据时,根据key的哈希值找到对应的segment数组下标 找到下标后就会添加一个reentrantlo…...

【杂谈】-递归进化:人工智能的自我改进与监管挑战

递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)

🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

GitHub 趋势日报 (2025年06月08日)

📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

ios苹果系统,js 滑动屏幕、锚定无效

现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

图表类系列各种样式PPT模版分享

图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

10-Oracle 23 ai Vector Search 概述和参数

一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...