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

Shell中的变量

1、变量命名

  • 可以使用数字,字母,和下划线给变量命名
  • 不能用数字开头
  • 如果给同一个变量赋值多次,最后一次赋值会覆盖之前的值
var1=value#普通赋值方法var2='value'var3="hello world"#当变量的值(字符串)中包含任何空白符时,加双引号var4="$(ls-l)"#将命令结果赋值给变量

注意:=前后不要有空格(区别于其他语言,Shell对空格检查严格)

2、变量的使用
使用一个定义过的变量,只要在变量名前面加美元符号$即可,如:

str="Hello"echo$strecho${str}

当需要标明变量的边界时,需要加上花括号。

skill="Java"echo"I am good at${skill}Script

如上,如果不加花括号会被认为是$skillScript,导致出现问题

3、变量作用域

  1. 局部变量
    局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
  2. 环境变量
    所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
  3. shell变量
    shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行

4、内置变量
shell内置的环境变量是所有的shell程序都可以使用的变量,环境变量会影响所有的脚本的执行结果。

变量说明
PATH命令的搜索路径,以冒号作为分隔符
HOME用户的家目录的路径,是cd命令的默认参数
COLUMNS命令行编辑模式下可使用命令的长度
HISTFILE命令历史的文件路径
HISTFILESIZE命令历史中包含的最大行数
HISTSIZEhistory命令输出的记录数
LOGNAME当前用户的名字
SHELL当前使用的shell
PWD当前的工作目录

在Shell中,调用函数时可以向其传递参数。在函数体内部,通过$𝑛的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数等。注意,若参数数量超过10,需要使用${10}的形式获取。

参数解释
$#命令行的参数的个数
$0当前脚本的名称,$2表示脚本的第二个参数……
$*以“参数1 参数2 参数3”的形式返回所有参数的值
$@以“参数1”“参数2”“参数3”的形式返回所有参数的值
$$返回本程序的进程ID(PID)
$?返回本程序的结束状态码

5、取消变量

unsetxxx#将之前定义的变量xxx删除,后面将不在有效。

如果直接关闭终端进程,也可以达到取消变量的效果。

6、变量扩展语法

形式说明
${var}变量本来的值
${var:-word}如果变量 var 为空或已被删除(unset),那么返回 word,但不改变 var 的值。
${var:=word}如果变量 var 为空或已被删除(unset),那么返回 word,并将 var 的值设置为 word。
${var:?message}如果变量 var 为空或已被删除(unset),那么将消息 message 送到标准错误输出,可以用来检测变量 var 是否可以被正常赋值。如果在Shell脚本中发生了这个替换,那么脚本将停止运行。
${var:+word}如果变量 var 被定义,那么返回 word,但不改变 var 的值。

7、字符串操作
计算长度

string="abcd"echo${#string}#输出 4

提取子串

string="alibaba is a great company"echo${string:1:4}#输出liba

拼接字符串

your_name="qinjx"greeting="hello, "$your_name" !"greeting_1="hello,${your_name}!"echo$greeting$greeting_1

查找字符串

string="alibaba is a great company"echo`exprindex"$string"is`
text="read phy addr: 0x1f reg: 0x1f value : 0x0"str="value : "value=${text#*$str}#打印value的值echo"$value"0x0

替换字符

string="123123"echo${string/3/0}#用0替换第一个遇见的3echo${string//3/0}#用0替换串中所有3
http://www.jsqmd.com/news/1284333/

相关文章:

  • STM32与A5000加密芯片的物联网安全方案设计
  • 3D打印尺寸偏差分析与补偿优化:从原理到实践实现精密装配
  • 如何让单机游戏变成本地多人派对?终极分屏工具Nucleus Co-Op完整指南
  • Allegro 保存文件时提示被锁定了,但实际上是没有人为的设置密码,要怎么解锁呢?
  • 2026年英国留学重庆靠谱四名词评测:五家优选深度解析 - 科技焦点
  • 掌控板2.0与MQTT协议打造智能语音台灯:从物联网通信到微信小程序开发
  • C语言字符数组与字符串
  • Grasscutter Tools完整攻略:原神私服管理的一站式解决方案
  • [论文学习]The Instruction Hierarchy:训练LLM优先处理特权指令
  • AI工作流与关键词采集API在亚马逊SEO中的实践
  • 树莓派驱动WS2812B LED点阵屏制作木制复古游戏显示器
  • 2026个人信息保护合规审计机构怎么选?避坑指南与品牌推荐
  • 3个技巧让Android弹窗开发变得简单:BasePopup库实用指南
  • STEAM教育:从概念到实践,培养复杂问题解决者与终身学习者
  • 3分钟掌握:RPG Maker MV资源解密工具全攻略
  • 无需技术背景上岗:AI能帮我做什么生意?开箱即用特性解读
  • MHmarkets:从合规意识切入的框架归纳
  • .NET构建与发布优化:从演进历程到现代实践
  • 解锁FromSoftware游戏动画的创作密码:DSAnimStudio深度探索
  • Agent 大模型蒸馏与合成数据指南
  • 基于行空板与二哈识图的智能番茄钟盆栽制作指南
  • 基于Arduino的智能水质监测船:触屏遥控与实时数据采集
  • 华为非AI方向笔试 7月24号 真题 【双11购物狂欢】
  • PTEN缺失前列腺癌患者新选择:FDA批准Truqap卡匹色替capivasertib联合阿比特龙显著延缓疾病进展
  • 嵌入式开发实战:SPI模式驱动TF卡存储方案详解
  • AI时代,中层管理者之危
  • C 语言数组从入门到精通:一维数组、二维数组与内存存储全解析
  • ClickHouse托管Postgres:OLTP+OLAP,新能力解锁最佳数据平台
  • 千问新人福利!8元无门槛优惠券直接领,输入 千问新人福利uqo6UY 免费领券,实测可用!
  • 北大等多机构联手破解AI视频“边想边画“难题:让机器先谋后动