Shell 变量

Shell 编程-Shell 变量详解 今天给伙伴们分享一下Shell 编程-Shell 变量,希望看了有所收获。 阅读详情

先不要管Shell的版本,来看看Shell 变量,在Shell中有三种变量:系统变量,环境变量,用户变量。其中用户变量在编程过程中使用最多,系统变量在对参数判断和命令返回值判断会使用,环境变量主要是在程序运行的时候需要设置。

 

1 系统变量

Shell常用的系统变量并不多,但却十分有用,特别是在做一些参数检测的时候。下面是Shell常用的系统变量

表示方法 描述
$n $1 表示第一个参数,$2 表示第二个参数 ...
$# 命令行参数的个数
$0 当前程序的名称
$? 前一个命令或函数的返回码
$* 以"参数1 参数2 ... " 形式保存所有参数
$@ 以"参数1" "参数2" ... 形式保存所有参数
$$ 本程序的(进程ID号)PID
$! 上一个命令的PID

其中使用得比较多得是 $n $# $0 $? ,看看下面的例子: 

#!/bin/sh
#This file is used to explain the shell system variable.
echo "the number of parameter is $# ";
echo "the return code of last command is $?";
echo "the script name is $0 ";
echo "the parameters are $* ";
echo "/$1 = $1 ; /$2 = $2 ";

下面是运行结果:

-bash-2.05b$ ./chapter2.1.sh winter stlchina
the number of parameter is 2
the return code of last command is 0
the script name is ./chapter2.1.sh
the parameters are winter stlchina
$1 = winter ; $2 = stlchina

这个例子太简单了,一点也不实用,下面来个实用的,如果你看不懂,没有关系,后面的内容会有详细解释。 

#!/bin/sh
if [ $# -ne 2 ] ; then
echo "Usage: $0 string file";
exit 1;
fi
grep $1 $2 ;
if [ $? -ne 0 ] ; then
echo "Not Found /"$1/" in $2";
exit 1;
fi
echo "Found /"$1/" in $2";

上面的例子中使用了$0 $1 $2 $# $? 等变量,下面是程序的解释:

  1. 判断运行参数个数,如果不等于2,显示使用"用法帮助", 其中 $0 表示就是脚本自己。
  2. 用grep 在$2 文件中查找$1 字符串。
  3. 判断前一个命令运行后的返回值(一般成功都会返回0, 失败都会返回非0)。
  4. 如果没有成功显示没找到相关信息,否则显示找到了。
  5. 其中/"表示转义,在"" 里面还需要显示"号,则需要加上转义符/" .

下面运行的例子:

./chapter2.2.sh usage chapter2.2.sh 
Not Found "usage" in chapter2.2.sh
-bash-2.05b$ ./chapter2.2.sh Usage chapter2.2.sh
echo "Usage: $0 string file";
Found "Usage" in chapter2.2.sh

2 Shell用户变量

2.1 基础

不管系统变量有多少,对于需求来说,总是不够的。用户变量是最常用到的变量,使用也十分简单。

用户定义的变量必须由字母数字及下划线组成,并且变量名的第一个字符不能为数字, 与其它UNIX名字一样,变量名是大小写敏感的. 对于用户变量,用户可按如下方式赋值: 

  name="Winter"

在引用变量时,需在前面加$符号,用户也可以在变量间进行相互赋值,如: 

  name="Winter"
WINTER=$name
echo "Hello $WINTER !"

输出结果应该很清楚:Hello Winter !

这里需要注意一点:变量和'='之间不要有空格,'='和赋值也不要有空格,否则shell不会认为变量被定义。掌握了基本的使用方法,你可以完全开始你的编程工作了。不过有时候需要未雨绸缪,下面介绍用户变量的一些技巧。

2.2 使用技巧

也可以用变量和其他字符组成新的字,这时可能需要把变量用{}括起,如: 

 SAT=Satur
echo Today is ${SAT}day

输出结果是: Today is Saturday

有时候为了避免变量名和别的字符产生混淆,你最好养成习惯把变量名用{}括起来。

对于未赋值的变量, Shell以空值对待, 用户也可以用unset命令清除给变量赋的值.看一个例子: 

#!/bin/sh
echo "a=$a" ;
a=2
echo "a=$a" ;
unset a
echo "a=$a" ;

先猜猜结果是什么? 

-bash-2.05b$ ./test.sh 
a=
a=2
a=

如果你懂C++,你应该知道有个变量修饰符"const",用于避免程序一不小心对变量进行修改。在shell中,对于用户变量,你可以使用同样的修饰符"readonly", 如果我把上面的例子修改成这样: 

#!/bin/sh
echo "a=$a" ;
#下面增加了readonly
readonly a=2
echo "a=$a" ;
unset a
echo "a=$a" ;

其结果当然会不一样了: 

-bash-2.05b$ ./test.sh 
a=
a=2
a=2
2.3 shell 中的数组

shell变量 中还能设置数组,但是不同的shell版本有不同数组赋值方法,而bourne shell 中不支持数组方式。因此,如果不是十分需要,还是建议你不要使用数组。若你的数据结构十分复杂,必须要使用数组,那么我建议你还是选择别的语言 吧,shell不是万能的。

shell有两种赋值方式,第一种是直接用下标赋值: 

name[0]="Tom"
name[1]="Tomy"
name[2]="John"
...

另一种方式对于不同的shell版本不一样。bash中赋值: 

#!/usr/local/bin/bash
name=("Tom" "Tomy" "John")
for i in 0 1 2
do
echo $i:${name[$i]} ;
done;

上面两种赋值方式达到的效果一样。另外,你看见访问数组元素的方法了吗?使用${name[index]}的方式。注意第一行使用的是#!/usr/local/bin/bash, 和以前有些不一样哦。其输出结果是:

-bash-2.05b$ ./test.sh    
0:Tom
1:Tomy
2:John

3 shell 环境变量

shell 环境变量是所有shell 程序都会接受的参数。shell程序运行时,都会接收一组变量,这组变量就是环境变量。常用的环境变量:

名称 描述
PATH 命令搜索路径,以冒号为分隔符.注意与DOS下不同的是, 当前目录不在系统路径里
HOME 用户home目录的路径名,是cd命令的默认参数
COLUMNS 定义了命令编辑模式下可使用命令行的长度
EDITOR 默认的行编辑器
VISUAL 默认的可视编辑器
FCEDIT 命令fc使用的编辑器
HISTFILE 命令历史文件
HISTSIZE 命令历史文件中最多可包含的命令条数
HISTFILESIZE 命令历史文件中包含的最大行数
IFS 定义SHELL使用的分隔符
LOGNAME 用户登录名
MAIL 指向一个需要SHELL监视其修改时间的文件.当该文件修改后, SHELL将发消息You hava mail给用户
MAILCHECK SHELL检查MAIL文件的周期,单位是秒
MAILPATH 功能与MAIL类似.但可以用一组文件,以冒号分隔,每个文件后可跟一个问号和一条发向用户的消息
SHELL SHELL的路径名
TERM 终端类型
TMOUT SHELL自动退出的时间,单位为秒,若设为0则禁止SHELL自动退出
PROMPT_COMMAND 指定在主命令提示符前应执行的命令
PS1 主命令提示符
PS2 二级命令提示符,命令执行过程中要求输入数据时用
PS3 select的命令提示符
PS4 调试命令提示符
MANPATH 寻找手册页的路径,以冒号分隔
LD_LIBRARY_PATH 寻找库的路径,以冒号分隔

这些变量,要关注的最多的就是PATH, 其重要性不要我说了吧?

如果你希望把你定义的变量让其他所有的shell程序都能使用,也就是定义新的环境变量。你只要使用export关键词就可以了。例如: 

export MY_NAME=Winter
export PATH=/home/winter/bin:$PATH

上面的程序中,第一行输出MY_NAME变量,第二行是在环境变量PATH中增加一个路径/home/winter/bin 。如果你希望这些设置在你登陆unix/linux都有效,你需要把他们加入到你的shell启动脚本中, 如果是使用bash 

~/.bash_profile

其他版本你看一眼就知道了,在你的home目录下,以"."开头的文件,一般都会隐藏起来,你需要使用'ls -al'命令来显示。

树莓派CM4 PCIe扩展方案与ASM1184e芯片应用 PCIe(Peripheral Component Interconnect Express)是计算机硬件中重要的高速串行总线标准,广泛应用于存储、网络等设备连接。其核心原理是通过差分信号实现高带宽传输,PCIe Gen2 x1的理论带宽可达5Gbps。在嵌入式开发中,PCIe扩展技术能有效解决单板计算机接口不足的问题,特别适合树莓派等微型平台。ASMedia ASM1184e作为PCIe交换芯片,可将单个接口扩展为多个,支持热插拔且免驱动,极大提升了工程灵活性。通过PCIe交换机方案,开发者能在树莓派CM 阅读详情

相关推荐

Revit二次开发之双事件:空闲事件与DocumentChanged事件

对以下文章所展示的代码进行了修改,当前展示的代码可直接复制使用。 由于本人初学,下列语言为个人理解,如有错误请指正。   《引用1》中: 使用模态对话框,或者尽量保证事件在ExternalCommand的Execute函数或者ExternalApplication的OnStartup函数里面注册。 如果一定要使用非模态对话框,那么请使用ExternalEvent事件的Raise函数,强迫...

一个Revit二次开发的实习生 6147

深入浅出Shell编程: Shell 变量

深入浅出Shell编程: Shell 变量 深入浅出Shell编程: Shell 变量 1 系统变量 2 Shell用户变量 2.1 基础 2.2 使用技巧 2.3 shell 中的数组 3 shell 环境变量 先不要管Shell的版本,来看看Shell 变量,在Shell中有三种变量:系统变量,环境变量,用户变量。其中用户

xiaonamylove的专栏 703

K230开发板实战:5步搞定YOLOv8模型部署(附常见报错解决方案)

本文提供了一份详细的K230开发板部署YOLOv8模型的实战教程。内容涵盖从环境准备、模型转换到代码编写的完整流程,并重点解析了使用AICube工具链时常见的“生成部署文件异常”等报错解决方案,旨在帮助开发者高效完成嵌入式AI模型部署。

weixin_29053073的博客 786

linux shell 变量的名称来源于另一个变量的值

[root@hadoop ~]# name=me [root@hadoop ~]# name="me" [root@hadoop ~]# me="hongrao" 第一种方法 [root@hadoop ~]# eval echo \$$name hongrao 第二种方法,bash2.0 [root@hadoop ~]# echo ${!name} hongrao

韩王-信 1662

使用mne包来对脑电数据进行预处理(一)

MNE(MNE-Python)是一个用于处理脑电(EEG)、磁图(MEG)和其他神经科学数据的Python库。它提供了丰富的功能,包括数据加载、预处理、分析和可视化,旨在帮助研究人员和神经科学家更轻松地进行脑电数据的处理和分析。在本文中,我们使用mne来对不同的格式的脑电数据集进行数据读取。

m0_71596228的博客 4305

白皮精读:70页 2025 基于数据空间的金融数据可信流通研究报告【附全文阅读】

金融数据可信流通面临法规、技术与商业模式的挑战。报告分析国内外发展现状,提出基于数据空间的可信流通框架,包含典型场景、技术方案与流通模式。实践案例显示,隐私计算、区块链等技术可提升风控效率与合规性。建议完善数据分类分级、统一技术标准并推动行业试点,以释放数据要素价值,促进数字经济发展。

cdfunlove的博客 849

《云计算》shell高级编程-shell函数第一篇(共两篇)

函数的定义 接下来几篇我们开始shell函数之旅, 怎么定义一个函数 怎么向函数传递参数,函数又是如何处理这些参数的 函数中的变量有什么作用范围,以及如何限制 函数中变量的作用 范围 函数如何返回,如何得到函数的返回值及怎样测试函数的返回值 可以怎样调用函数 怎样 在后台运行一个函数及其应用 来看一下语法格式: #函数名 function_name () { #函数体,在函数中执行的...

解启超 652

PLC如何控制电子膨胀阀(暖通空调/制冷系统)

电子膨胀在冷水机空调系统里广泛采用,大部分空调系统都会有电子膨胀阀,但是电子膨胀阀的控制接口和普通电磁阀完全不同,所以想要PLC直接控制电子膨胀阀,还是比较麻烦的,电子膨胀阀可以理解为一个简易步进电机,体积非常小,线圈和转子部分可以分离。下面我们看下PLC如何控制电子膨胀阀。

RXXW_Dor的博客 4761

shell脚本基础知识梳理<三>:条件测试与比较、流程控制 if

一、条件测试与比较1、test 测试表达式 常用test -f file && echo true||echo false2、[ 测试表达式 ] 特别常用[ -f file ]&& echo true||echo false3、[[ 测试表达式 ]]二、流程控制 1、流控制语句 if实例1#!/bin/bash#获取uid=0(root)中的0;id=id |...

527

paddlehub无法安装,安装报错【Bug完美解决】

paddlehub无法安装,安装报错【Bug完美解决】 我们正在进行一个基于Python的项目开发,该项目需要集成PaddleHub,以利用其丰富的深度学习模型和工具。PaddleHub提供了一种简便的方式来使用预训练模型,以加速开发过程并提高模型效果。 现在paddlehub安装出现问题了,本文彻底解决paddlehub无法安装的问题。

一键难忘的博客 3388

UG二次开发GRIP刻字

UG二次开发GRIP刻字

qq285503851的博客 1138

shell中变量的命名、字符的转义、变量的声明以及变量值的传递

1.shell中变量名称的规范 变量名称中通常包含大小写字母,数字,下划线 不是变量名中同时需要具备字母、数字、下划线,变量名只能出现这三种字符 变量名不能以数字开头,只能以字母或者下划线开头 变量名称格式定义: WESTOS_LINUX Westos_Linux westoS_Linux 2.字符的转译 |转译单个字符 “” ‘’ ‘’ 与 “” 两者的区别在于 ...

ymeng9527的博客 3451

信号完整性之串扰

1.前言 串扰(Crosstalk)是指信号线之间由互感、互容而引起的耦合,由于这种耦合的存在,当某一信号线发生电平翻转时,在附近的信号线上将感应到一定程度的噪声。 2. 电路设计中抑制串扰的方法 2.1 控制高速信号线之间的间距和平行走线的长度 多个高速信号长距离平行走线时,其间距应遵循3W原则,如下图所示: 3W原则指两相邻信号线的中心间距不少于信号线宽度的3倍,当满足3W原则时,信号线之间...

sinat_15677011的博客 1万+

awk使用shell变量及shell使用awk中的变量

在写shell脚本时,经常会使用到awk程序。但是有些复杂的逻辑,可能需要在awk中使用在shell中定义的变量,而且awk程序处理之后,产生的中间变量,还需要在shell中继续处理。 一、那如何在awk中使用在shell中定义的变量呢? 方法一:使用"'把shell变量包起来,即"'$var'";注意是“双引号+单引号+shell变量+单引号+双引号”的格式。 这种写法大家无需改变

rj042的专栏 6万+

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

shell变量

在 Shell 中,用括号来表示数组,数组元素用"空格"符号分割开。数组名=(值1 值2 ... 值n)或者value0value1value2value3可以不使用连续的下标,而且下标的范围没有限制。

运维老生常谈 1125

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

linux shell 编程之变量总结

shell 编程之变量总结

congge_study的博客 4407

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Shell学习——shell中的变量

号两边不能有空格,有的话要用引号引起来my varexit使用export可以将局部变量升级为全局变量my var但是,在子shell里面的变量修改不会改变外层父shell的值,如your varexitmy var。

m0_73716246的博客 1126

Shell脚本 —— Shell 变量

在Shell脚本中,变量是存储数据的基本单元,它们可以包含字符串、数字等,并在脚本中被引用和操作。

Darrich的博客 1495

Shell变量

预定义变量是由 Bash 程序预先定义好的一类特殊变量,用户只能使用预定义变量,而不能创建新的预定义变量,也不能直接为预定义变量赋值。预定义变量使用“$”符号和另一个符号组合表示,较常用的几个预定义变量的含义如下:$#:表示命令行中位置参数的个数$*:表示所有位置参数的内容:表示前一条命令执行后的返回状态,返回值为 0 表示执行正确,返回任何非 0值均表示执行出现异常。$0:表示当前执行的脚本或程序的名称。/bin/bashecho "脚本名为:$0"echo "第一个变量为:$1"

ZZH1120KQ的博客 1287

Shell学习——Shell变量

在 Shell 中,用括号来表示数组,数组元素用"空格"符号分割开。数组名=(值1 值2 ... 值n)

xd__xy的博客 1427

shell--2--shell变量 定义变量 使用变量 只读变量 删除变量 变量类型 Shell字符串 shell函数

Shell变量 @1变量即在程序运行过程中它的值是允许改变的量 @2变量是用一串固定的字符来表示不固定的值的一种方法 @3变量是一种使用方便的占位符,用于引用计算机内存地址,该地址可以存储Script运行时可更改的程序信息 @4在shell中变量是不能永久保存在系统中的,必须在文件中声明 定义变量 变量名不加$,如: Name=”rnunoob.com” 注意,变量名和等号之间不能...

weixin_40460156的博客 655

shell变量及赋值

1、变量的定义Bash中的变量操作相对比较简单,不像其他高级编程语言(如C/C++、Java等)那么复杂。在定义一个新的变量时,一般不需要提前进行声明,而是直接指定变量名称并赋给初始值(内容)即可格式:变量名=变量值变量名:临时存放数据的地方变量值:临时的可变化的数据等号两边没有空格。变量名称需以字母或下划线开头,名称中不要包含特殊字符(如+、-、*、/、.、?、%、&、#等)除了上述赋值操作以外,还可以使用 Bash 的内置命令 read 来给变量赋值。

2201_75549363的博客 2376
下一篇: awk文本处理总结(入门,中级,高级)
jjaing
博客等级 码龄23年 3粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值