如何逐行遍历硬编码的键值对,并将每一对解析为键和值?

时间:2018-08-04 02:32:15

标签: windows batch-file cmd keyvaluepair

我正在寻找与Windows batch(Cmd.exe)相对应的Unix bash代码,如下所示。键值对由HereDoc给出。通过与read命令关联的while命令重复读取该对。 IFS=$';'定义了分号(;)作为键和值之间的分隔符。 read命令将每一对解析为变量kyval。循环体应对变量$ky$val做一些事情。请注意,值可能包含空格。

while IFS=$';' read -r ky val; do
  # Do something about $ky and $val
  echo "$ky - $val"
done < <(cat << EOF
a;P p
b;Q q
c;R r
EOF
)
# OUTPUT
# a - P p
# b - Q q
# c - R r

bash的while-do-done复合命令的摘要是:

while ConditionalCommand; do COMMANDS; done

命令语句read -r ky val属于while的ConditionalCommand。

键值对列表可以视为关联列表。但是,无需创建一个数组,该数组除了占用列表之外还会占用内存。

在Cmd.exe上,我想到了

for %%i in (
a;P p
b;Q q
c;R r
) do (
rem Parse each pair into two variables.
rem Do something about the two variables.
)

但是,我不知道如何解析每一对,也不知道如何定义分隔符。

实际上,此批处理代码甚至无法按我预期的方式工作。我希望该批处理代码仅能执行循环主体三遍,并且%% i一次将收到一整对(或整行)。但是,循环主体实际上执行了九次,而%% i一次只接收一个字母,如以下代码所示。

@echo off
setlocal enabledelayedexpansion

set n=1
for %%i in (
a;P p
b;Q q
c;R r
) do (
rem Parse each pair into two variables.
rem Do something about the two variables.
echo !n!
echo %%i
set /a n+=1
)

rojo对问题“ Batch: Parse TXT Lines into Array”的回答(questions / 30403022)模拟了一个关联数组。但是,它使用包含键值对的外部文件。我不想使用文件来提供键值对。我想对键值对进行硬编码。那应该是逐行的;也就是说,每对有一条线。因此,列表必须包含多行。我不想将列表放在单个长行上,例如

a;P pNLb;Q qNLc;R r    # <-- I do not want this

Aacini对问题“ Find ALL Ocurences of Letter change to Diffrent Letter”的回答(questions / 35639223)使用了关联数组。但是,我不需要创建数组。对于我的应用程序来说,只需一个硬编码的关联列表就足够了。

1 个答案:

答案 0 :(得分:0)

如果键/值对不包含任何这些字符"?*,那么它将满足您的要求

for %%P in (
    "a;P p"
    "b;Q q"
    "c;R r"
) do for /F "tokens=1* delims=;" %%A in ("%%~P") do (
    echo Key: %%A  ** Value: %%B
)

每个键/值对都可以放在上一行中,也可以放在一行中。只要引用的一对之间至少被一个;,=<space><newLine>这样的分隔符隔开,FOR就很高兴。