二、变量和引用

news2024/12/23 5:32:22

目录

2.1 什么是变量

2.2变量的命名

2.3 变量的类型

2.3.1 根据数据类型分类

2.3.2 根据作用域分类

2.4 变量的定义

2.5 shell中的引用


在程序设计语言中,变量是一个非常重要的概念。也是初学者在进行Shell程序设计之前必须掌握的一个非常基础的概念。只有理解变量的使用方法,才能设计出良好的程序。本节将介绍Shell中变量的相关知识

2.1 什么是变量

顾名思义,变量就是程序设计语言中的一个可以变化的量,当然,可以变化的是变量的值。几乎所有的程序设计语言中都有定义变量,并且其涵义也大同小异。从本质上讲,变量就是在程序中保存用户数据的一块内存空间,而变量名就是这块内存空间的地址。

在程序的执行过程中,保存数据的内存空间的内容可能会不断地发生变化,但是,代表内存地址的变量名却保持不变。

2.2变量的命名

在Shell中,变量名可以由字母、数字或者下划线组成,并且只能以字母或者下划线开头。对于变量名的长度,Shell并没有做出明确的规定。因此,用户可以使用任意长度的字符串来作为变量名。但是,为了提高程序的可读性,建议用户使用相对较短的字符串作为变量名。

在一个设计良好的程序中,变量的命名有着非常大的学问。通常情况下,用户应该尽可能选择有明确意义的英文单词作为变量名,尽量避免使用拼音或者毫无意义的字符串作为变量名。这样的话,用户通过变量名就可以了解该变量的作用。

2.3 变量的类型

2.3.1 根据数据类型分类

Shell是一种动态类型语言和弱类型语言,即在Shell中,变量的数据类型毋需显示地声明,变量的数据类型会根据不同的操作有所变化。准确地讲,Shell中的变量是不分数据类型的,统一地按照字符串存储。但是根据变量的上下文环境,允许程序执行一些不同的操作,例如字符串的比较和整数的加减等等。

什么是弱类型语言、强类型语言?

强类型和弱类型主要是站在变量类型处理的角度进行分类的。强类型是指不允许隐式变量类型转换,弱类型则允许隐式类型转换。

(1)强类型语言,当你定义一个变量是某个类型,如果不经过代码显式转换(强制转化)

过,它就永远都是这个类型,如果把它当做其他类型来用,就会报错

(2)弱类型语言,你想把这个变量当做什么类型来用,就当做什么类型来用,语言的解析器

会自动(隐式)转换。

比如:

C语言定义变量,int+变量名,实则前面的int就是给变量内存划分了等级,int定义整型

所以空间里只能存放整型,这就是强类型。php、C#和Python等都是强类型语言。

可以使用declare定义变量的类型:declare attribute variable

注:declare命令还可输出所有的变量、函数、整数和已经导出的变量

+/- "-"可用来指定变量的属性,"+"则是取消变量所设的属性

-p:显示所有变量的值

-i:将变量定义为整数,在之后就可以直接对表达式求值,结果只能是整数。如果求值失败或者不是整数,就设置为0。

-r:将变量声明为只读变量。只读变量不允许修改,也不允许删除。(也可使用readonly定义只读变量)

-a:变量声明为数组变量。但这没有必要,所有变量都不必显示定义就可以用作数组。事实上,在某种意义上,似乎所有变量都是数组,而且赋值给没有下标的变量与赋值给下标为0的数组元素相同。

-f:显示所有自定义函数,包括名称和函数体。

-x:将变量设置成环境变量。可使用+x将变量变成非环境变量

#声明整数型变量
[root@kittod ~]# declare -i ab
[root@kittod ~]# ab=33
[root@kittod ~]# echo $ab
33

#改变变量属性
[root@kittod ~]# declare -i ef
[root@kittod ~]# ef=1
[root@kittod ~]# echo $ef
1
[root@kittod ~]# ef="wer"
[root@kittod ~]# echo $ef
0

[root@kittod ~]# declare +i ef
[root@kittod ~]# ef="wer"
[root@kittod ~]# echo $ef
wer

#设置变量只读
[root@kittod ~]# declare -r ab
[root@kittod ~]# ab=22
-bash: ab: readonly variable
[root@kittod ~]# echo $ab
33

#声明数组变量
[root@kittod ~]# declare -a cd='([0]="a" [1]="b" [2]="c")'
[root@kittod ~]# echo ${cd[1]}
b
[root@kittod ~]# echo ${cd[@]}
a b c

2.3.2 根据作用域分类

根据作用域可将变量分为环境变量(全局变量)和普通变量(局部变量)

1、环境变量

环境变量也可称为全局变量,可以在创建它们的shell及其派生出来的任意子进程shell中使用(su - 切换用户会读取新的环境变量),环境变量又可分为自定义环境变量和bash内置的环境变量。

(1)自定义环境变量

一般是指用export内置命令导出的变量,用于定义shell的运行环境,保证shell命令的正确执行。环境变量可以在命令行中设置和创建,但用户退出命令行时这些变量值就会丢失,即该环境变量只在当前shell和子shell中有效。如果希望永久保存环境变量,可以在配置文件中设置。

①用户的环境变量配置(non-login shell)

~/.bash_profile或~/.bashrc

②全局环境变量的配置(login shell)

/etc/bashrc、/etc/profile文件或者/etc/profile.d目录中定义。

注意:按照系统规范,所有环境变量的名字均采用大写形式。在将环境变量应用于用户进程程序之前,都应该用命令export导出。

有一些环境变量,比如HOME,PATH,SHELL,UID,USER等,在用户登录前就已经被/bin/login程序设置好了,通常环境变量被定义并保存在用户家目录下的.bash_profile文件或全局的配置文件/etc/profile中。

(2)bash内置的环境变量

shell内置的环境变量是所有的shell程序都可以使用的变量。shell程序在运行时,都会接收一组变量来确定登录用户名、命令路径、终端类型、登录目录等,这组变量就是环境变量。环境变量会影响到所有的脚本的执行结果。

注:可使用env查看环境变量

(3)普通变量也可称为局部变量,与全局变量相比,局部变量的使用范围较小,通常仅限于某个程序段访问,例如函数内部。在Shell语言中,可以在函数内部通过local关键字定义局部变量,另外,函数的参数也是局部变量。

示例:全局变量和局部变量的区别

#先自定义一下vim编辑器
[root@kittod ~]# cat .vimrc
#按下 Tab 键时,Vim 显示的空格数。
set tabstop=4

#由于 Tab 键在不同的编辑器缩进不一致,该设置自动将 Tab 转为空格。
set expandtab

#Tab 转为多少个空格。
set softtabstop=4

[root@kittod ~]# vim vartest.sh
#!/bin/bash
#定义函数
func()
{
#输出全局变量v1的值
echo "global variable v1 is $v1"

#定义局部变量v1
 local v1=2
 
#输出局部变量v1的值
echo "local variable v1 is $v1"
}
#定义全局变量v1
v1=1

#调用函数
func

#输出全局变量v1的值
echo "global variable v1 is $v1"
[root@kittod ~]# chmod a+x vartest.sh
[root@kittod ~]# ./vartest.sh
global var v1 is 1
local var v1 is 2
global var v1 is 1

2.4 变量的定义

在Shell中,通常情况下用户可以直接使用变量,而毋需先进行定义,当用户第一次使用某个变量名时,实际上就同时定义了这个变量,在变量的作用域内,用户都可以使用该变量。

1、变量定义示例:变量名=变量值

#定义变量a 
a=1
#定义变量b 
b="hello"
#定义变量c 
c="hello world"
#定义备份路径
bak_dir=/data/backup
#把一个命令的结果赋值变量
变量名=`ls`
变量名=$(ls)

注意:

(1)“=”前后不能有空格

[root@localhost ~]# a= 3
-bash: 3: 未找到命令
[root@localhost ~]# b =4
-bash: b: 未找到命令

(2)字符串类型建议用引号括起来,尤其是特殊字符或有空格

stu_name="zhang san"

引用变量:$变量名 或者${变量名}

查看变量:echo $变量名,set(可查看所有变量:包括自定义变量和环境变量),env显示全局变量,declare输出所有的变量、函数、整数和已经导出的变量。

取消变量:unset 变量名

作用范围:仅在当前shell中有效

注:可使用export指令将变量转换成环境变量

2、位置参数和预定义变量

许多情况下,Shell脚本都需要接收用户的输入,根据用户输入的参数来执行不同的操作。

从命令行传递给Shell脚本的参数又称为位置参数,Shell脚本会根据参数的位置使用不同的位置参数变量读取它们的值。

$# 命令行参数的个数

$n 表示传递给脚本的第n个参数,例如$1表示第一个参数,$2表示第二个参数,

$3 表示第三个参数

$0 当前脚本的名称

$* 以"参数1 参数2 参数3…"的形式返回所有参数的值

$@ 以“参数1”“参数2”“参数3”…的形式返回所有的值

$? 前一个命令或者函数的返回状态码。$?的返回值用法:(1)判断命令、脚本或函数等程序是否执行成功(2)若在脚本中调用执行“exit 数字”,则会返回这个数字给 “$?”变量(3)如果是在函数里,则通过“return 数字”把这个数字以函数值的形式传给“$?”

$$ 返回本程序的进程ID(PID),不常用

$! 获取上一个在后台工作的进程的进程号,不常用

$_ 保存之前执行的命令的最后一个参数,不常用

示例:

[root@kittod ~]# cat param.sh
echo "第1个位置参数是$1"
echo "第2个位置参数是$2"
echo "所有参数是: $*"
echo "所有参数是: $@"
echo "参数的个数是: $#"
echo "当前进程的PID是: $$"
[root@localhost test]# bash param.sh shuju1 shuju2
第1个位置参数是shuju1
第2个位置参数是shuju2
所有参数是: shuju1 shuju2
所有参数是: shuju1 shuju2
参数的个数是: 2
当前进程的PID是: 23278

$?的示例:

[root@kittod ~]# cat ping.sh
#!/bin/bash
ping -c2 $1 &> /dev/null
if [ $? = 0 ];then
 echo "host $1 is ok"
else
 echo "host $1 is fail"
fi
[root@kittod ~]# chmod a+x ping.sh
[root@kittod ~]# ./ping.sh 192.168.217.128
host 192.168.217.128 is ok
[root@kittod ~]# ./ping.sh 192.168.217.129
host 192.168.217.129 is fail

$*和$@的区别示例:

[root@kittod ~]# set -- "i have" a cat
[root@kittod ~]# echo $#
3
[root@kittod ~]# echo $*
i have a cat
[root@kittod ~]# echo $@
i have a cat
[root@kittod ~]# for i in $*;do echo $i;done
i
have
a
cat
[root@kittod ~]# for i in $@;do echo $i;done
i
have
a
cat
[root@kittod ~]# for i in "$*";do echo $i;done
i have a cat
[root@kittod ~]# for i in "$@";do echo $i;done
i have
a
cat
[root@kittod ~]# shift
[root@kittod ~]# echo $1
a
[root@kittod ~]# shift
[root@kittod ~]# echo $1
cat

2.5 shell中的引用

在bash中有很多特殊字符,这些特殊字符就具有特殊含义。引用就是通知shell将这些特殊字符当作普通字符来处理。

说明:反引号中的字符串将被解释为shell命令

[root@kittod ~]# echo "current user is: $USER"
current user is: root
[root@kittod ~]# echo 'current user is: $USER'
current user is: $USER
[root@kittod ~]# echo "current user is: `whoami`"
current user is: root
[root@kittod ~]# echo 'current user is: `whoami`'
current user is: `whoami`

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1597307.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

D3-八数码

D3-八数码 题目描述解题思路代码如下 题目描述 解题思路 本题若直接在3*3网格中思考较为困难,可以转换为一维的字符串,在一维字符串中考虑较为简单,要注意本题中两个字符交换位置时只能是x和另外字符交换,本题另外一个难点在于如何…

借力社交裂变,Xinstall助你实现用户快速增长

在数字化时代,社交裂变已成为品牌获取新用户、扩大影响力的关键手段。然而,如何有效利用社交裂变,实现用户快速增长,却是许多品牌面临的挑战。今天,我们将为大家介绍一个强大的社交裂变引擎——Xinstall,它…

Cesium 无人机航线规划

鉴于大疆司空平台和大疆无人机app高度绑定,导致很多东西没办法定制化。 从去年的时候就打算仿大疆开发一套完整的平台,包括无人机app以及仿司空2的管理平台,集航线规划、任务派发、实时图像、无人机管理等功能的平台。 当前阶段主要实现了&…

包装类初识泛型

一.包装类 在Java中, 基本类型不继承于Object类. 所以为了在泛型代码中可以支持基本类型,Java给每个基本类型都对应了一个包装类型.(包装类型相当于引用类型) 1.基本类型对应的包装类 byte -- Byteshort -- Shortint -- Integerlong -- Longfloat -- Floatdouble -- Doublech…

20V/3A大电流线性稳压器替代MIC29302/MIC29300

概述(替代MIC29302/MIC29300) PCD3942 是一款低压差稳压器,专为快速瞬态响应而优化。该装置能够提供 3A 的输出电流,典型压降为 325mV。工作静态电流为 1mA,关机时降至 1μA 以下,同时压差模式下静态电流控制良好。除了快速瞬态响…

lua学习笔记20(lua中一些自带库的学习)

print("*****************************lua中一些自带库的学习*******************************") print("*************时间***************") --系统时间 print(os.time()) --自己传入参数得到时间 print(os.time({year2011,month4,day5})) --os.data(&qu…

《HF经理》:二认知误区

一、管理者掌握重要权力: 二、全力来自管理者的职位: 三、管理者必须控制自己的直接下属: 对策:展示自己的品质,能力和影响力 四、管理者必须建立良好的个人关系: 五、管理这必须确保一切运行正常&…

深度学习框架

深度学习框架 1 引言 在当今技术加速发展的时代,深度学习已经成为了人工智能领域内最为引人注目的子领域之一。其在图像识别、自然语言处理、自动驾驶等多个行业中的成功应用,已经证明了深度学习在解决复杂问题方面的巨大潜力。然而,深度学习…

31、链表-K个一组反转链表

思路: 首先知道如何反转链表,其次找出每组的开始节点和结束节点,然后对于不足与k个的链表保持原状。 代码如下: class Solution {public ListNode reverseKGroup(ListNode head, int k) {if (headnull||k1){return head;}ListN…

一个小小逻辑符的错误使用,资损几万块?

分享是最有效的学习方式。 博客:https://blog.ktdaddy.com/ 故事 这是一个真实事件,三年前老猫负责公司的支付资产业务。为了响应上级号召,加强国央企之间的合作,公司新谈了一个支付对接的渠道(当然这个支付渠道其实很…

IT精英的财富攻略:五大策略揭秘

IT精英的财富攻略:五大策略揭秘 💸 数字化浪潮汹涌,IT技能成为职场的金钥匙🔑,更为智慧的IT人打开了赚钱的大门。如果你身怀网络维护与安全管理的绝技,那么这五大策略,正是你蓄势待发的赚钱法宝…

【Qt 学习笔记】Qt常用控件 | 按钮类控件Push Button的使用及说明

博客主页:Duck Bro 博客主页系列专栏:Qt 专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ Qt常用控件 | 按钮类控件Push Button的使用及说明 文章编号&#xff1…

09 - 镜像管理之:部署单点harbor

本次准备了3台机器:harbor-01、harbor-02、harbor-db,用于测试 单点模式、高可用模式 部署 harbor。 ip主机名规格操作系统说明192.168.217.136harbor-012c4gCentos7.9harbor 服务器,测试单点harbor192.168.217.135harbor-022c4gCentos7.9ha…

快速探索随机树-RRT

文章目录 简介原理算法运动规划的变体和改进简介 快速探索随机树(RRT)是一种算法,旨在通过随机构建空间填充树来有效搜索非凸高维空间。该树是从搜索空间随机抽取的样本中逐步构建的,并且本质上偏向于向问题的大型未搜索区域生长。RRT 由 Steven M. LaValle 和 James J. K…

数据库SQL语言实战(一)

目录 创建SQL表 题目一 题目二 题目三 插入数据 题目一 题目二 题目三 总结 创建SQL表 题目一 创建学生信息表(学生编号、姓名、性别、年龄、出生日期、院系名称、班级): test1_student:sid char 12 not null、nam…

Unity Shader之数学篇

一、坐标系 1、二维笛卡尔坐标系 屏幕坐标系是二维笛卡尔坐标系,OpenGL的屏幕坐标系原点在左下角,DirectX的屏幕坐标系原点在左上角。 2、三维笛卡尔坐标系 三维笛卡尔坐标系要区分是左手坐标系还是右手坐标系。 左手坐标系:举起你的左手…

3.Burp Suite 入门篇 —— 修改请求

目录 前言 官网注册 Burp 浏览器访问漏洞页面 登陆购物网站账号 修改请求包 漏洞挖掘 前言 本篇文章会教你如何用 Burp Proxy 修改截获的请求。 修改请求包是为了通过网站程序规定之外的方式请求,然后对比查看响应内容的变化,判断是否有漏洞存在…

Wpf 使用 Prism 实战开发Day20

备忘录功能页面完善以及优化 备忘录功能基本跟前一章节的待办事项差不多一至&#xff0c;就不再做过多的笔述了 一.备忘录功能完整页面源码 MemoView.xaml <UserControl x:Class"MyToDo.Views.MemoView"xmlns"http://schemas.microsoft.com/winfx/2006/xam…

src挖掘 | 未授权访问+密码重置

0x01系统初探 通过fofa对大学进行搜索 fofa:host"edu.cn" && status_code"200" 在随意的翻阅查看时&#xff0c;发现访问xxx.edu.cn登录页面会优先访问登录后的页面&#xff0c;再跳转至登录页面。盲猜应该是前端校验&#xff0c;可以通过抓包拦…

Qt5 编译oracle数据库驱动

库文件 1、Qt源码目录&#xff1a;D:\Qt5\5.15.2\Src\qtbase\src\plugins\sqldrivers\oci 2、oracle客户端SDK: https://www.oracle.com/database/technologies/instant-client/winx64-64-downloads.html 下载各版本中的如下压缩包&#xff0c;一定要版本相同的 将两个压缩包…