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]%%)