我正在寻找与Windows batch(Cmd.exe)相对应的Unix bash代码,如下所示。键值对由HereDoc给出。通过与read
命令关联的while
命令重复读取该对。 IFS=$';'
定义了分号(;)作为键和值之间的分隔符。 read
命令将每一对解析为变量ky
和val
。循环体应对变量$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)使用了关联数组。但是,我不需要创建数组。对于我的应用程序来说,只需一个硬编码的关联列表就足够了。
答案 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
就很高兴。