网站推广只能使用在线手段进行。国家扶持新型环保项目

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

网站推广只能使用在线手段进行。,国家扶持新型环保项目,秦皇岛做网站公司汉狮价格,小程序商城怎么弄编程基础 - 变量与常量 返回序言及专栏目录 文章目录 编程基础 - 变量与常量前言一、变量是什么#xff1f;二、为什么要有变量三、局部变量和全局变量四、常量五、只读变量小结 前言 变量是编程最重要知识点之一#xff0c;从根本上讲#xff0c;编程就是对数据的操作二、为什么要有变量三、局部变量和全局变量四、常量五、只读变量小结 前言 变量是编程最重要知识点之一从根本上讲编程就是对数据的操作让数据按我们设定的逻辑进行运算。变量是用于存储数据的内存地址的人性化表示方式。在shell中数据类型比较简单它属于弱数据类型的编程语言简而言之它自动帮你处理了有关数据类型的工作。 一、变量是什么 顾名思义变量就是可以变化的量。很多书上这么写的笔者也学习一下但这是一句没什么意义的话纯粹是为了让人更迷糊的说法。 变量是内存地址的别名别名就是外号的文雅说法。这是某本知名C/C语言著作上的说法具体是哪本书我忘记了当然外号这句是笔者加的从这个角度比较容易解释什么是变量。 都知道计算机系统中内存是必不可少的数据是暂时存储在内存当中的。所以当你用PS修图的时候如果没有保存就突然停电来电以后你就要找出原图重新开始修1。这就是因为内存中的数据没有被保存到我们的硬盘上。 既然数据是先存储在内存中的不管内存有多大把内存细分成字节来管理1G内存约有1千兆个字节兆表示10的6次方。这个数量是极其庞大的大到我们光用二进制写一个内存地址就要写很久程序在退休前肯定写不完还得找个继承人接着写更关键的是你无法记住这么长的一串数字表示的地址。所以我们要有一个好记的简短的名字来给我们所使用到的内存地址命名。 当然实际情况肯定是比这复杂多了内存实际是由系统管理的系统分配给你哪块就用哪块。变量只是给这部分内存起了一个名字。希望这么解释变量能让读者有个概念变量不是什么稀奇的玩意就是一个内存地址的名字。 那为什么那么多书都说变量是可以变化的量呢那些作者比笔者我傻吗肯定不是的看下一节的演示你就明白为什么说它是可以变化的量了。 二、为什么要有变量 对啊我不用变量不就行了要这种抽象的概念来做什么呢假设我们要求计算机计算12等于多少不用变量你输入echo \(((12))计算机也会告诉你是3没毛病。那我们要学习高斯同学的1加到100呢你把1到100都写一遍吗显然没有这个必要加数是有规律的每次加1那么我们可以在变量被使用后每次让它加上1就是下一次计算的加数了。计算出的和也是一个道理先让和是12的结果下一次计算我们让和加上3以此类推就轻松的得出结果了。当然这个高斯同学小学时的例子太简单我们来个复杂点的著名例子 有数列11235813 … 我们想知道第37个数是什么之所以要37个是怕读者太聪明口算得出结果~ 显然它的规律是每个数都是前两个数的和。我们可以编写程序来计算 #!/bin/sh a1 b1 i3 while [ \)i -lt 38 ]dotmp\(aa\)bb\(tmp\)bi\(i1done echo \)b 我就不信有口算这么厉害的人没算出来吧~ 我们看看具体逻辑细节 while是一个循环只要当变量i小于38它就一直在do和done之间循环。每次循环程序会把变量a的值赋值给变量tmp用于记录变量a的值下行a的值会改变。再把变量b的值给变量a把变量tmp和b的值加起来给b。用变量i加上1表示计算了一次直到变量i等于37while循环条件不满足了程序跳出循环。echo显示结果 这个程序的4个变量在运行时不停的改变自身存储的值。正是因为变量的值在程序的运算过程中不停的变化我们才叫它变量变量的存在才让程序变得简洁、灵活。 三、局部变量和全局变量 通常我们将变量分为局部变量和全局变量。在函数内部被定义的变量我们叫它局部变量它只在函数内部作用。当函数被调用结束时这个变量也就销毁了。相对的在函数外部定义的变量我们称之为全局变量这种变量在整个程序运行期间起作用。 这里引出了函数和调用的概念函数我们可以认为是一个功能模块它是为了实现某一个功能而定义的代码集合。局部变量只在定义它的函数内部有效这个函数就是它的作用域。 如果局部变量和全局变量重名全局变量会在同名局部变量的函数内被屏蔽。因为全局和局部是个相对的概念相对于整个系统来说每个程序内定义的变量都是局部变量。 这么分是有意义的主要是为了节省内存空间的占用局部变量用完就销毁的特性避免内存被无意义的数据填满。同时也能让程序员不用关心程序的其它部分定义了什么变量不然多个程序员协作大家就天天为了变量命名权打架了。 通常程序员会把全局变量写在程序的开始部分这个开始并不一定是程序代码的最上部而是指程序执行的入口部分很多时候这个入口都写在程序的最下面部分。当然写在代码最前面也是一种好习惯。这么做是为了阅读程序方便实际上只要变量在被使用前定义就行。 大多数编程语言规定变量名只能用大小写字母和数字、下划线_ 组成且数字不能位于变量名开头。 我们用几个例子来看一下 age23 # 很好的变量名简单又有意义 age_124 # 较好的变量名还可以命名多个类似的 _age_23 # 通常程序员喜欢用下划线在前的变量表示在内部调用的 _tmp23 # 也有程序员喜欢用这种变量名表示临时的 years_old23 # 有很多程序员喜欢这样命名也常用于函数命名 yearsOld23 # 这叫驼峰命名也是很常用的也是通常用于函数名 AGE23 # 符合规则但通常不用全大写定义变量 abc23 # 符合规则但没有意义不建议使用 1a23 # 错误的命名方式四、常量 既然有变量相应的就有常量。变量是可以变化的量常量就是通常不变的量。比如Linux系统本身就定义了一些常量 echo \(HOME # 家目录和~的作用一样 /root echo \)PWD /tmp/home/root echo \(PATH /koolshare/bin:/koolshare/scripts:/opt/bin:/opt/sbin:/bin:/usr/bin:/sbin:/usr/sbin:/home/admin:/mmc/sbin:/mmc/bin:/mmc/usr/sbin:/mmc/usr/bin:/opt/sbin:/opt/bin:/opt/usr/sbin:/opt/usr/bin echo \)SHELL /bin/sh echo \(IFS# 这里有一个空格 echo \)USER admin echo \(UID 0 # 路由器上这个命令可能没有显示 echo \)HOSTNAME RT-AC68U-F2A7 以下是一些常用的系统已定义常量 HOME 家目录和的作用一样PWD 当前路径PATH 环境常量可执行程序的搜索路径SHELL shell所在路径IFS 分隔符默认为空格可以用于把字符串按IFS分割成数组USER 当前用户名UID 当前用户的ID相应的就有GID没加入组就没有HOSTNME 主机名 我们在程序中也可以自定义常量它和变量没有本质的区别。命名规则也是一样只是通常用全大写来命名。这只是一个概念表示这是个常量我们不是不能修改它的值只是不想修改它。包括系统定义的常量我们也是可以修改的最常见之一就是IFS adminRT-AC68U-F2A7:/tmp# touch test.txt adminRT-AC68U-F2A7:/tmp# echo this is a test! test.txt adminRT-AC68U-F2A7:/tmp# cat test.txt this is a test! adminRT-AC68U-F2A7:/tmp# for i in \((cat test.txt)do echo \)idone this is a test!上述代码中touch是一个新建空白文件命令如果要建立的文件已经存在命令会改变这个文件的最后访问时间记录并不会改变文件内容。重定向符用于将标准输出stdout重定向到文件中。如果目标文件不存在则创建新文件若已经存在同名文件会被覆盖。最上面的touch是可以不写的只是作者的习惯。 我们把这个字符串改一改再来测试 adminRT-AC68U-F2A7:/tmp# echo this,is,a,test! test.txt adminRT-AC68U-F2A7:/tmp# cat test.txt this,is,a,test! adminRT-AC68U-F2A7:/tmp# for i in \((cat test.txt)do echo \)idone this,is,a,test!上面这个例子很好的说明了IFS的作用默认以空格来分割字符串当我们的字符串改成以逗号分隔时因为字符串中没有空格所以不进行分割了。下面我们就修改这个IFS常量 adminRT-AC68U-F2A7:/tmp# cat test.txt this,is,a,test! adminRT-AC68U-F2A7:/tmp# IFS_OLD\(IFS adminRT-AC68U-F2A7:/tmp# IFS, adminRT-AC68U-F2A7:/tmp# for i in \)(cat test.txt)doecho \(idone this is a test! adminRT-AC68U-F2A7:/tmp# IFS\)IFS_OLD这个例子说明了常量是可以修改的即使它是系统定义的常量。通常我们修改了IFS后要第一时间给改回去。所以程序第一步就是将原IFS值先保存在IFS_OLD中最后又改回去了。 五、只读变量 如果我们实在不想一个变量或常量被无意中修改在c/c中有静态变量的概念shell中也有只读变量可以做到。你可以定义一个通常不能改变的变量 adminRT-AC68U-F2A7:/tmp/home/root# readonly age23
adminRT-AC68U-F2A7:/tmp/home/root# echo \(age 23 adminRT-AC68U-F2A7:/tmp/home/root# age24 -sh: age: is read only adminRT-AC68U-F2A7:/tmp/home/root# unset age adminRT-AC68U-F2A7:/tmp/home/root# echo \)age 23 adminRT-AC68U-F2A7:/tmp/home/root# unset -v age adminRT-AC68U-F2A7:/tmp/home/root# unset age adminRT-AC68U-F2A7:/tmp/home/root# echo $age 23 unset用于删除一个变量。这样定义的变量是只读的一般情况不能修改在shell中还设计成很难修改删除都不能。当然它只在内存中你重启系统就没了。有人说服务器让你随便重启吗对的所以少用这个定义变量的方法。还有人说用unset -v 变量名 可以解除只读属性至少在路由的这个2.6版内核中是不可行的这真是够顽强的。笔者也没在多个发行版Linux中测试过这个估计在ubuntu20.4中是不可行的笔者查过这个命令的帮助文件 salsal-laptop:
\( uname -a Linux sal-laptop 5.4.0-169-generic #187-Ubuntu SMP Thu Nov 23 14:52:28 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux salsal-laptop:~\) unset –help unset: unset [-f] [-v] [-n] [名称 …]取消设定 shell 变量和函数的值和属性。对每一个 NAME 名称删除对应的变量或函数。选项-f 将每个 NAME 视为函数-v 将每个 NAME 视为变量-n 将每个 NAME 视为名称引用只取消其本身而非其指向的变量不带选项时unset 首先尝试取消设定一个变量如果失败再尝试取消设定一个函数。某些变量不可以被取消设定参见 readonly。退出状态返回成功除非使用了无效的选项或者 NAME 名称为只读。 从这个帮助文件可以看出函数也是用unset来删除的所以函数和变量是有共通之处的。从本质上讲变量和函数都是用户在内存中存储的一串0和1。 小结 本章介绍了变量和常量的概念需要了解变量和常量的命名规则以及通常用法这个规则在绝大多数的编程语言中是通用的。 返回专栏目录 某些软件设计了随时保存临时文件的功能在我们使用软件的过程中定时或检测到活动就保存到硬盘上的一个文件中。当停电后重启电脑可能可以找到一个临时文件来恢复大部分数据。 ↩︎