脚本语言Batch入门教程第二章:认识变量相关概念
i春秋助您提升技能,实力倍增!
在前两期的学习内容中,我们已经了解了Batch入门教程有关的知识和编程方法,如何编写和运行Windows Batch程序,脚本语言的入门方式等,今天我们将继续深入学习Batch入门教程之认识变量相关概念。
前期回顾
◀Batch入门教程丨部署与Hello World(上)
◀Batch入门教程丨部署与Hello World(下)
进阶
我们在之前所接触到的三个指令仅仅是Batch中的冰山一角,一些比较重点的指令都会放在本节中进行讲述。在进阶内容中,您将会了解到变量、逻辑判断、调用与传参和函数这几大概念。
在本次发布内容中,我们来了解第一大概念:变量。
变量
变量(Variable),在初中对函数的学习中我们可能接触到了这个名词,当然,如果您还没有接触到也没有关系,您只需要将它理解为“一种可以改变的值”即可。在计算机中,变量的含义会更加清晰,因为它的确是可以变的。
我们如果提到变量,就必定会谈到赋值(Assignment)。这个赋值并不是代数中的赋值(名词),而是一个动宾短语。赋,即赋予,给予,这个词的意思很明显了,就是给予一个值。给予谁值呢?我们就要谈到变量名(Name)了。变量名一般是可以随便取的,但是如果我们想要更好地去分辨,我们最好取一些有意义的名字。
set
set是变量操作最基本的指令,它能够指定一个变量名并给它赋值。下面是一个常见的变量赋值表达式:
set a=1
其中,set为变量操作指令,它是不可缺少的。a是变量名,它的值则是=后的1。那么,=是等号吗?不是。在计算机领域,=从来没有等号的意思,它被称为赋值运算符(Assignment Operator),只要看到它,就代表着左侧与右侧相等,但是它并不表示相等关系。
也就是说,如果我们要表达“a 与 1 相等”,那么我们需要的是a==1而不是 a=1。假设此时a的值为hello,那么我们若执行:
此时a的值会被彻底改变,变成1。也就是说,a=x任何时候都成立,因为它是用来改变左侧变量名所对应的值的,而a==x仅在a真正与x相等时成立。
经过一系列的纠结和解释,我们最终得到了一个名为a的变量,它的值为1。那么这个时候我们就要想办法来使用它。能不能与之前的echo结合起来呢?
echo %a%
得到1。是可以的。在Batch中,您可以用%变量名%的形式来表示一个变量,并且在任何地方都可以用,比如:
set a=set
set b=a
set c=^=
set d=1
set e=%a% %b%%c%%d%
%e%
pause
exit
这个突如其来的奇怪程序也许非常难懂。接下来我们慢慢分析。
首先我们可以看到,我们定义了5个变量,分别叫做a, b, c, d, e。那么您能说出它们的值是多少吗?我相信答案是肯定的,除了c和e。
a的值为set,b的值为a,c的值为=,d的值为1。那么,如果我们一个一个地echo它们呢?
echo %b%
echo %c%
echo %d%
我们得到的结果将是这样的:
这看起来就像是一个指令:
这样您也许可以猜到e的值是什么了。没错,e的值就是a, b, c, d的组合。可以注意到,%a%右边有一个空格,其它的都是相连的,这样组合起来也是不会变的。那么把
%a% %b%%c%%d%
组合起来,我们就得到了:
然后下面有一个单行,写着:
这样,在e的值被赋为set a=1后,再把%e% 当作指令执行,我们就相当于是执行了指令:
随后再echo出a的值,我们得到的是1。
转义字符
为什么%c%的值是=而不是^=?
首先我们观察:
在这里,如果我们去掉了中间的^,那么这就是一个错误的指令,因为==会被识别成判断是否相等的运算符,而右边又是空的,更何况set没有这种用法。
set c==
所以我们需要让cmd知道我们是想让c等于=(等于等于)。于是^的用处有了。它叫做转义符(Escape Character),用来把原本有特殊含义的符号给转义成一般的字符。
转义符的作用很多,您能想到吗?
如果我们想要输出一句话,这句话里包含%a%,但是我们并不想要输出a的值,而仅仅是输出两个百分号和一个a,怎么办?转义符的用处有了。我们可以这样写:
echo %%a%%
这里我们又用到了一个转义符,它叫做“双百分号”,但它只能在使用变量转义的时候起作用。因而:
与
set c=%%=%%
不相等。
^转义符的效用是它后面的1个字符,%%转义符用来代表一个正常没有特殊含义的%。使用%%a%%,我们得到的结果就不是a的值了。我们看一个示例:
这样,我们得到的结果是:
set /p
set指令有非常多的参数。在本教程中介绍/p和/a两种。首先,set /p属于暂留性指令中的一种,也是用户输入的第二种途径。如果您想要让用户自己来定义变量的值,您将需要用到/p。
set /p a=
含/p参数的set指令,赋值运算符右侧无论是什么,都不会影响到它的值。若我们单单执行set /p a=,我们将得到:
这是一个输入空框,我们可以随意在这里输入东西。例如,我们输入 123456,那么什么也不会发生:
但是如果此时我们调出%a%的值,效果就出现了:
也就是说,我们输入的任何东西都已经被赋入了变量a里。/p参数的用处就在如此。
但是,每一次都是这个输入空框,用户根本不知道输入什么。这样,我们就可以再赋值运算符右侧加上提示文字,来提示用户这是在输入什么。运行如下程序:
其中,this is my passwd是笔者手动输入的部分。
那么,我们结合先前将变量直接当作指令执行的方式,来制造一个假的cmd控制台:
这时,我们输入的值会直接被赋入%command%内,紧接下一行就是直接把变量的值当作指令来处理。也就是说,我们输入一条指令,就会被直接当作指令来处理,从而实现假控制台的效果。
利用这条思路,我们就可以自定义我们自己的控制台了。当然这是后续的内容。
set /p <
多了一个<,意义就完全不一样了。准确来说,这种用法是建立在文件重定向运算符<上的。它的具体用法:
set /p a=<1.txt
左侧没有多大的区别,仍然是变量名,但是右侧则是一个<加上一个文件。严格来讲,这个文件只能是纯文本文件(扩展名随意,只要不是二进制即可)。这条指令的意思是从1.txt读取第一行的所有内容并赋值到%a% 中。
我们不妨直接做个实验:
这样,从文件读取内容也成功了。但是如果有多行文本呢?出于局限性,这个方法只能读取第一行的内容。在后面的学习中,我们会介绍如何读取全部内容,以及如何选择性地读取指定行的内容。
set /a
指定/a参数可以进行数学运算操作。如果set指令拥有/a参数,那么它的赋值运算符后面的变量不需要带上百分号。
例如:
但是前提是赋值运算符后的变量必须为数字。因为/a是专为数学运算而设计的,所以这样能够让计算写作时更加快速。
一个简单的加减乘除程序就可以通过参数/a来实现:
这代表着在/a参数的前提下,赋值运算符后将可以直接写四则运算符号。但是这远远不够。因为批处理的局限性,目前是无法计算超过32位的数字以及任何浮点数的(所以不建议用批处理计算除法)。不过,这样就相当于是实现了计算器的核心功能。
至此,set介绍得就差不多了。接下来我们了解一下环境变量。
环境变量
环境变量(Environment Variable),是指系统已经预先配置好的父进程环境默认设置。简要来讲,就是一些包含您计算机的基本信息的变量,虽然说叫做“变量”,但是实际上如果您的系统没有从底层上发生改变,这些变量的值是不会改变的。
环境变量在批处理的作用非常巨大,可以节省我们编写代码的时间,也能让我们的代码更加适配其它人的电脑。
我们举个例子,众所周知很多人的Windows系统是安装在盘符为C:的存储空间的,因此如果我们在批处理内要对系统盘内的项进行操作,我们必定需要写路径。例如,我们要用上文中提到的set /p指令来读取位于系统盘根目录的1.txt,那么怎么做?(忽略权限)
set /p content=<C:\1.txt
一般我们的思路当然就会是这样的了,但是,您有没有思考过,万一真的有人系统盘不在C盘呢?(实际上这种情况非常普遍)这条指令岂不是失去意义了?这个时候,环境变量就发挥作用了。环境变量可以根据不同的电脑而改变,这就是它“变”的地方。
例如,在Windows中有一个环境变量,叫作%SYSTEMDRIVE%(环境变量不区分大小写),它的字面意思是系统盘符(System Drive Volume),这也是它所代表的。那么我们可以直接在echo指令中输出它,因为它在系统安装的时候就被定义了。
我们得到的是C:,这正是我们系统盘的盘符。
而如果某人的电脑系统盘是E:,那么这个变量的值就会等于E:。利用这个原理,我们就可以适配所有的电脑了,于是把我们的指令修改成:
set /p content=<%SYSTEMDRIVE%\1.txt
这样,这条指令就有了万能性。
环境变量的使用方法基本上就是这样,接下来我们列出一些常用的环境变量:
变量截取与替换
如果我们希望将一个变量分段,只取其中一部分内容,在Batch中是有方法的。
set a=1234567890
echo %a:~0,1%
上面的执行结果是1。看吧,这是一个您不认识的变量写法。:~0,1就是变量控制符。一般地,在Batch中,我们对变量截取有以下原则:
%操作变量名:~始, 终%
其中,操作变量名很好理解,这是我们要采取截取工作的变量。例如,我们要截取变量a,那么操作变量名就是a。始(from Index),指定从哪一位(Index)开始截取,终(to Index)指定截取到的位。
在计算机中,位是从0开始的。也就是说,我们日常生活中所表示的1,在这里就是0。观察以下数据:
1234567890
请问这组数据中的第一个数字是什么?是1。但是,如果我们要在计算机内表示的话,我们要说它在第0位。以此类推,如果我们要截取变量的前8位,那么我们应当写成:
%a:~0,8%
这行代码代表截取变量a的第一位至第八位。如果我们仿照上例执行:
echo %a:~0,8%
我们将得到12345678。这种截取也适用于非0开头。需要注意的是,开头的位必须与我们现实生活中所数的位数少1。例如:
set a=你好啊
echo %a:~1,1%
输出的结果是好。这行代码代表从第2位开始,截取1个字符。那么我们就直接截取了第2位本身。如果我们将终改为2,我们得到的结果是 好啊,即从第2位开始,截取了2位。
请您参考如下例子来好好了解一下变量截取:
我们同样可以反过来,从相反方向截取。例如:
set a=3.14
echo %a:~-1%
这种用法里没有始和终的区分。以上例子代表截取a的倒数第一位,我们得到的结果是4。如果我们使用echo %a:~-2%,那么我们截取的是倒数的两位,结果是14。以此类推,当我们使用echo %a:~-n% 的时候,实际上是截取了这个数据的倒数n位(即从倒数第1位一直截取到倒数第n位)。
此外我们还可以结合起来用:
echo %a:~0,-1%
我们得到的结果是3.1。这行指令代表截取从正数第一位一直到倒数第一位之前的那一位的数据。以此类推,当我们使用echo %a:~b,-c%的时候,实际上是截取了这个变量从正数第a+1位到倒数第|c|+1位的数据。
至于变量替换,相对于变量截取,比较简单。
set a=我好!
echo %a:我=你%