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

web vue 项目 Docker化部署

Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage)&#xff1a…...

docker详细操作--未完待续

docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

JVM垃圾回收机制全解析

Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

OkHttp 中实现断点续传 demo

在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...

生成 Git SSH 证书

🔑 1. ​​生成 SSH 密钥对​​ 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​: -t rsa&#x…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解

在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...

vulnyx Blogger writeup

信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...

人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent

安全大模型训练计划:基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标:为安全大模型创建高质量、去偏、符合伦理的训练数据集,涵盖安全相关任务(如有害内容检测、隐私保护、道德推理等)。 1.1 数据收集 描…...

WPF八大法则:告别模态窗口卡顿

⚙️ 核心问题:阻塞式模态窗口的缺陷 原始代码中ShowDialog()会阻塞UI线程,导致后续逻辑无法执行: var result modalWindow.ShowDialog(); // 线程阻塞 ProcessResult(result); // 必须等待窗口关闭根本问题&#xff1a…...