在cmd / DOS批处理脚本中,变量周围使用方括号表示法

12

我看过使用方括号来包围变量的cmd批处理脚本。例如:

@echo off
if [%1]==[] (
echo no parameter entered
) else (
echo param1 is %1
)

这是什么的目的?

2个回答

17

它用于正确的语法。想象一下,您想检查一个变量是否为空:

if %var%== echo bla

显然会失败。(语法错误)

相反:

if "%var%"=="" echo bla

工作正常。

另一个“坏事”:您想检查一个变量,但它可能为空:

if %var%==bla echo bla

如果 %var% 不为空,则很好地运作。但如果它空的,则该行将被解释为:

if ==bla echo bla

显然是语法问题。但是

if "%var%"=="bla" echo bla

将被解释为

if ""=="bla" echo bla

正确的语法。

你可以使用其他字符代替"。有些人喜欢用[%var%],有些人用!.有些人只使用一个字符来包围字符串,如if %var%.==.最常见的是用"来包围(因为如果变量包含空格或未引用的特殊字符(如&),它不会失败。)*),但这取决于个人口味。

*)非常感谢dbenham提供的这个重要信息。


所以对于空变量,引号""和方括号[]可以互换使用?它们没有区别吗?我认为使用[]可能有一些优势,与""相比。 - Jim
8
@Jim - 使用 [%var%]==[value] 没有优势。它和 ]%var%[==]value[XXX%var%==XXXvalue 一样有效。使用 "%var%"=="value" 的优势在于,如果 var 包含未引用的毒瘤字符(如 &),它不会失败。 - dbenham
@dbenham - 但是,如果 var 包含一个未引用的毒瘤字符,比如 ", 它将会失败。考虑 SET var="foo bar",它将变成 if ""foo bar""==""; 这很可能会给你一个错误提示 bar""=="" was unexpected at this time.... - jimbobmcgee
1
@jimbobmcgee - 是的,这就是为什么我总是尽量避免在变量值中使用引号。如果我真的想要能够处理任何内容的强大代码,那么我会使用延迟扩展。 - dbenham

3
方括号用于检查空格,因为如果您使用以下代码:
if %1==[] (
echo no parameter entered
) else (
echo param1 is %1
)

没有方括号包围变量时,它会显示

此时不期望出现 (

并退出。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接