我在Windows脚本中遇到了特定的for循环,但我无法找到有关如何将其转换为Bash等效内容的任何帮助。代码在这里:
for f "tokens=2 delims=#" %%a in $step; do set devnum=%%a
set $devnum=$devnum:)=%
我知道它循环变量$step
我只是不知道如何在Bash中使用令牌和分隔符。任何帮助将不胜感激。
答案 0 :(得分:0)
在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:)=%
循环为变量f
使用"tokens=2 delims=#"
提供了一些函数或可执行文件%%a
,其中%%a
每次循环时都会$step
中的值执行设置devnum=%%a
(来自$step
的当前值并设置$devnum=$devnum:)=
(无论对初始devnum值的修改如何)。
转换为bash for
循环不仅需要翻译for
循环语法,还需要翻译$step
列表和翻译{{ 1}}。 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
循环来处理文件并将每一行分解为标记:
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
#
分隔的2个令牌,将成为%%a
来自$a
的文件名将在结束$step
处输入while read
循环。 done <"$a"
取消设置IFS(但你也可以使用它来打破IFS=
,但我看不到你的输入我不知道)语句#
将读取提供的文件名中的每一行按read line || [ -n "$line" ]
并将$a
传递到$line
循环的内部,以根据需要处理到令牌中。您很可能会使用参数扩展/子字符串提取来从while
获取所需的标记。获得令牌后,您可以根据需要分配$line
。
如果您要提供所需代码的文件内容和示例,我很高兴向您展示如何使用devnum
提取代币(如果需要,请重新访问substring extraction
设置)
注意:如果IFS
是一个文件列表,那么没有需要$step
循环所有。所有处理都可以使用bash中的for
循环完成。如果没有提供while
中包含的内容以及将被解析到令牌中的文件内容的示例,很难确切知道您要尝试做什么。