Shell 为什么数组中使用的集合不能使用echo?
我现在正在学习批处理脚本,这里有一个非常简单的脚本:Shell 为什么数组中使用的集合不能使用echo?,shell,batch-file,Shell,Batch File,我现在正在学习批处理脚本,这里有一个非常简单的脚本: @echo off set a[0]=0 set a[1]=1 set a[2]=2 set a[3]=3 set a[4]=4 set a[5]=5 for /l %%n in (0,1,5) do (echo %a[%%n]%) 为什么结果是“回声关闭” 如果我在(0,1,5)中像那样为/l%%n写入do(回显a[%%n]) 我可以 a[0] a[1] a[2] a[3] a[4] a[5] 那么为什么我不能使用echo来获取数组
@echo off
set a[0]=0
set a[1]=1
set a[2]=2
set a[3]=3
set a[4]=4
set a[5]=5
for /l %%n in (0,1,5) do (echo %a[%%n]%)
为什么结果是“回声关闭”
如果我在(0,1,5)中像那样为/l%%n写入do(回显a[%%n])
我可以
a[0]
a[1]
a[2]
a[3]
a[4]
a[5]
那么为什么我不能使用echo来获取数组的值呢?因为你不应该在块中使用百分比扩展(这里是FOR块),因为在解析块时百分比会被扩展 改用延迟扩展
setlocal EnableDelayedExpansion
for /l %%n in (0,1,5) do (echo !a[%%n]!)
以下是一种不必启用的替代方法: 循环体
call echo%%a[%%n]%%
由于call
而被解析两次;在第一次变为调用echo%a[0]%
期间,假设%%n
的当前值为0
,因为%%
变为%%
,而在第二次,将%a[0]
替换为变量的相应值
在您的方法中,
echo%a[%%n]%
,命令行解释器看到两个要展开的变量,即%a[%
和%n]%
,这两个变量都未定义,因此被零替换。当命令处理器找到一个块(括号之间的任何内容)时,对其进行完全解析,并将变量展开到计算块时的值。如果更新块中的变量值,则需要为变量启用延迟扩展以反映所做的更改。使用setlocal EnableDelayedExpansion
并将语法从%var%
更改为!瓦尔代码>使延迟的扩展工作。有一个有趣的网站在给定的链接很好的解释。漂亮的演示,大量的描述和代码,但所有的例子都是错误的!set
命令中的等号前不得有空格。您可以在查看批处理文件中有关阵列管理的详细说明。
for /l %%n in (0,1,5) do (call echo %%a[%%n]%%)