将for循环从Windows转换为Bash

时间:2014-08-23 01:53:24

标签: bash wsh

我在Windows脚本中遇到了特定的for循环,但我无法找到有关如何将其转换为Bash等效内容的任何帮助。代码在这里:

for f "tokens=2 delims=#" %%a in $step; do set devnum=%%a
set $devnum=$devnum:)=%

我知道它循环变量$step我只是不知道如何在Bash中使用令牌和分隔符。任何帮助将不胜感激。

1 个答案:

答案 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 filenameset

的每条评论

编辑

这更有意义。在这种情况下,您将使用嵌入式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中包含的内容以及将被解析到令牌中的文件内容的示例,很难确切知道您要尝试做什么。