当前位置: 首页 > 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…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

微信小程序之bind和catch

这两个呢&#xff0c;都是绑定事件用的&#xff0c;具体使用有些小区别。 官方文档&#xff1a; 事件冒泡处理不同 bind&#xff1a;绑定的事件会向上冒泡&#xff0c;即触发当前组件的事件后&#xff0c;还会继续触发父组件的相同事件。例如&#xff0c;有一个子视图绑定了b…...

【位运算】消失的两个数字(hard)

消失的两个数字&#xff08;hard&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;Java 算法代码&#xff1a;更简便代码 题⽬链接&#xff1a;⾯试题 17.19. 消失的两个数字 题⽬描述&#xff1a; 给定⼀个数组&#xff0c;包含从 1 到 N 所有…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时&#xff0c;可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案&#xff1a; 1. 检查电源供电问题 问题原因&#xff1a;多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象&#xff1a;mysql已经安装&#xff0c;但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时&#xff0c;可能是因为以下几个原因&#xff1a;1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

Java线上CPU飙高问题排查全指南

一、引言 在Java应用的线上运行环境中&#xff0c;CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时&#xff0c;通常会导致应用响应缓慢&#xff0c;甚至服务不可用&#xff0c;严重影响用户体验和业务运行。因此&#xff0c;掌握一套科学有效的CPU飙高问题排查方法&…...

算法笔记2

1.字符串拼接最好用StringBuilder&#xff0c;不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

Docker 本地安装 mysql 数据库

Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker &#xff1b;并安装。 基础操作不再赘述。 打开 macOS 终端&#xff0c;开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...