在 DOS 中,for 循环语法为 FOR %A IN (list) DO command [ parameters ](%%A 用于批处理文件,而%A 用于命令行)。在 bash 中,语法是 for var in list; do command; done 在您的情况下,您有:
for f "tokens=2 delims=#" %%a in $step; do set devnum=%%a set $devnum=$devnum:)=%
循环使用"tokens=2 delims=#" 为变量%%a 提供一些函数或可执行f,其中%%a 将在每次循环执行设置devnum=%%a 时采用$step 中的值(当前值来自$step 并设置 $devnum=$devnum:)=(无论对初始 devnum 值的修改如何)。
翻译成 bash for 循环不仅需要翻译 for 循环语法,还需要翻译 $step 列表和翻译 commands。 for 循环(没有列表和命令翻译)变为:
for $a in (whatever list $step is); do
tmpvar=$(f "tokens=2 delims=#" $a) # the translated f will be done inside the loop
devnum=$tmpvar
(whatever $devnum=$devnum:)=% translates to)
done
在您展示$step 是什么之前,没有人可以告诉您$step 的含义。 f 的翻译也是如此。话虽如此,循环结构的通用翻译将如上所示,除非f 不是函数或可执行文件。我希望这会有所帮助。留下额外的评论或编辑您的问题以提供更多信息,我很乐意提供进一步的帮助。
编辑每条关于 /f 文件名集的评论
这更有意义。在这种情况下,您将使用嵌入的 while read ln; do ..stuff.. done 循环来处理文件并将每一行分成标记:
for $a in (whatever list $step is); do
while IFS= read line || [ -n "$line" ] ; do
(parse $line as needed to get 2 tokens)
devnum=(some $tmpvar from the token parsing) # these two line may move outside the
(whatever $devnum=$devnum:)=% translates to) # while loop, depending on the tokens
done <"$a"
done
由于有更多信息,它似乎 $step 持有要逐行读取的文件名并处理成两个用 # 分隔的标记 %%a 将变为 $a 持有来自 $step 的文件名,这将是在结束 done <"$a" 处输入 while read 循环。 IFS= 未设置 IFS(但您也可以使用它来中断 #,但如果没有看到您的输入我无法判断)语句 read line || [ -n "$line" ] 将读取 $a 提供的文件名中的每一行并通过$line 到 while 循环的内部,根据需要处理成令牌。您很可能会使用参数扩展/子字符串提取从$line 获取您需要的令牌。获得令牌后,您可以根据需要分配devnum。
如果您将提供所需令牌的文件内容和示例,我很高兴向您展示如何使用 substring extraction 提取令牌(如果需要,请重新访问 IFS 设置)。
注意:如果$step 看起来是文件列表,则不需要for 循环。所有处理都可以通过 bash 中的 while 循环来完成。如果不提供$step 中包含的内容以及将被解析为令牌的文件内容的示例,就很难确切地知道您正在尝试做什么。