关于变量引用和call对引用的解析
来源:互联网 发布:人口老龄化 知乎 编辑:程序博客网 时间:2024/05/04 09:59
大家都知道call命令是用来调用其他程序的。
想必有一定经验的朋友都知道要输出%a%需要这样写“echo %%a%%”,这样
百分号会脱掉一个。
先以一个简单的echo作为引子:
例一、
代码:
@echo off
set a=b
echo %a%
echo %%a%%
echo %%%a%%%
echo %%%%a%%%%
echo %%%%%a%%%%%
pause
运行结果是:
b
%a%
%b%
%%a%%
%%b%%
解说:不知道大家看没看出来问题。批处理中类似于这样的变量替换究竟是
如何进行的呢?我们姑且称之为“替换步骤”
“替换步骤”大体分为两步:
第一步:
当百分号“%”是偶数时(只按一边的百分号数目计算),变量将
不被替换,其它的也不变。当百分号是奇数时(也只按一边的百分号数目计
),最里层的“%a%”将被替换成变量的值,此时百分号数目将少了一个(
只按一边计)。
第二步:
第一步完成后,百分号就都是偶数了。好了,现在把百分号数目的
一半脱掉,剩下的就是结果了。
拿本例的“echo %%%%%a%%%%%”为例说明一下。第一步,由于百分号有
5个是奇数,因此最里层的%a%被其值代替,现在变为“%%%%b%%%%”;第二
步,将百分号脱去一半,就变为“%%b%%”。怎么样,理解了吗?
再看看有call的时候。
例二、
复制内容到剪贴板
代码:
@echo off
set a=b
set b=c
set c=d
call echo %%%%%%%%a%%%%%%%%
call echo %%%%%%%%%%%%%a%%%%%%%%%%%%%
pause
运行结果是:
%%a%%
%%%b%%%
解说:由于有call的存在,“替换步骤”就会多进行一次。以“call echo
%%%%%%%%%%%%%a%%%%%%%%%%%%%”为例。
“替换步骤”第一次:
第一步:
百分号有13个是奇数,因此最里层的“%a%”被其值b替换,此时为
“%%%%%%%%%%%%b%%%%%%%%%%%%”,现在百分号数目为12个了。
第二步:
将百分号数脱去一半,现在为“%%%%%%b%%%%%%”。
“替换步骤”第二次:
第一步:
百分号有6个是偶数,因此不替换。现在仍然是“%%%%%%b%%%%%%”。
第二步:
将百分号数脱去一半,现在为“%%%b%%%”。
结果就是“%%%b%%%”。
(如果有n个call那么就要进行n+1次“替换步骤”。)
call命令在“变量延迟”中也遵循“替换步骤”。
举个例子:我现在要将字符串str1的“superhero”部分替换为chess,在此我们用间接的方法实现。代码如下:
复制内容到剪贴板
代码:
@echo off
set str1=mynameissuperhero
set str2=supxrhxro
set a=x
call call set str3=%%%%str1:%%str2:%a%=e%%=chess%%%%
echo %str3%
pause
因为用了两个call,因此要进行3次“替换步骤”。
“替换步骤”第一次:
1、将“%a%”替换成“x”,结果为“%%%%str1:%%str2:x=e%%=chess%%%%”。
2、将百分号脱去一半,为“%%str1:%str2:x=e%=chess%%”。
“替换步骤”第二次:
1、将“%str2:x=e%”替换掉,结果为“%%str1:superhero=chess%%”。
2、将百分号脱去一半,为“%str1:superhero=chess%”。
“替换步骤”第三次:
1、将“%str1:superhero=chess%”替换掉,结果为“mynameischess”。
2、将百分号脱去一半(没的脱了),因此结果为“mynameischess”。
【原文地址http://apps.hi.baidu.com/share/detail/23023925】
- 关于变量引用和call对引用的解析
- 对临时变量的引用
- 关于全部变量的引用
- 关于PHP的变量引用
- self.方法和_对变量的引用的区别
- C/C++中关于地址、指针和引用变量的学习笔记(十) : 引用型变量
- 对python变量和对象引用的探讨
- 变量的声明和引用
- 引用和变量的关系。
- 关于数组的引用和引用数组
- 引用变量和引用数组
- 引用类型变量和非引用类型变量的区别
- jquery中对变量的引用
- block 对外部引用变量的处理
- block 对外部引用变量的处理
- 关于引用临时变量
- 指针变量和引用变量的区别
- 关于变量,对象,引用的存放。
- C# 单实例运行
- iPhone视频播放器(1)
- 修改Chrome浏览器(包括以其为内核)默认背景颜色为豆沙绿护眼色(支持windows ubuntu)
- Oracle表与索引的分析及索引重建
- 译文:Linux 与 BSD 之间的 10 个不同之处
- 关于变量引用和call对引用的解析
- 关于if与else
- 项目经理的职责
- Oracle 创建 DBLink 的方法
- sql server 2008 R2 附加数据库错误(5123)
- 写在开学的前一天
- C语言宏定义技巧
- C++类库
- Oracle PL/SQL之函数索引(Function-based indexes)使用示例