如何逐行循环硬编码的键值对并将每一对解析为键和值?
How to loop through hard-coded key-value pairs line by line and parse each pair into key and value?
我正在寻找下面显示的 Unix bash 代码的 Windows 批处理 (Cmd.exe) 副本。键值对由 HereDoc 给出。这些对由与 while
命令关联的 read
命令重复读取。 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。
键值对列表可以看作是关联列表。但是不需要创建数组,除了list之外还会占用内存
关于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对“”问题的回答(questions/30403022)模拟了一个关联数组。但是,它使用包含键值对的外部文件。我不想使用文件来提供键值对。我想硬编码键值对。那应该是逐行的;也就是说,每对一行。因此,列表必须由多行组成。我不想把列表放在像
这样的长行上
a;P pNLb;Q qNLc;R r # <-- I do not want this
Aacini 对问题“”(questions/35639223) 的回答使用了关联数组。但是,我不需要创建数组。对于我的应用程序来说,一个硬编码的关联列表就足够了。
如果 Key/Value 对不包含任何这些字符 "?*
那么这将执行您想要的操作
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
)
每个 Key/Value 对可以单独放在一行中,如上所示,也可以放在一行中。这只是一个品味问题,只要引用的对由至少一个分隔符分隔,例如 ;,=<space><newLine>
,FOR
是快乐的。
我正在寻找下面显示的 Unix bash 代码的 Windows 批处理 (Cmd.exe) 副本。键值对由 HereDoc 给出。这些对由与 while
命令关联的 read
命令重复读取。 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。
键值对列表可以看作是关联列表。但是不需要创建数组,除了list之外还会占用内存
关于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对“
a;P pNLb;Q qNLc;R r # <-- I do not want this
Aacini 对问题“
如果 Key/Value 对不包含任何这些字符 "?*
那么这将执行您想要的操作
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
)
每个 Key/Value 对可以单独放在一行中,如上所示,也可以放在一行中。这只是一个品味问题,只要引用的对由至少一个分隔符分隔,例如 ;,=<space><newLine>
,FOR
是快乐的。