【问题标题】:Converting a for loop from Windows to Bash将 for 循环从 Windows 转换为 Bash
【发布时间】:2014-08-23 01:53:24
【问题描述】:

我一直被困在 Windows 脚本中的一个特定 for 循环中,我找不到任何关于如何将其转换为 Bash 等效项的帮助。代码在这里:

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

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

【问题讨论】:

    标签: bash wsh


    【解决方案1】:

    在 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 列表和翻译 commandsfor 循环(没有列表和命令翻译)变为:

    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 &lt;"$a" 处输入 while read 循环。 IFS= 未设置 IFS(但您也可以使用它来中断 #,但如果没有看到您的输入我无法判断)语句 read line || [ -n "$line" ] 将读取 $a 提供的文件名中的每一行并通过$linewhile 循环的内部,根据需要处理成令牌。您很可能会使用参数扩展/子字符串提取$line 获取您需要的令牌。获得令牌后,您可以根据需要分配devnum

    如果您将提供所需令牌的文件内容和示例,我很高兴向您展示如何使用 substring extraction 提取令牌(如果需要,请重新访问 IFS 设置)。

    注意:如果$step 看起来是文件列表,则不需要for 循环。所有处理都可以通过 bash 中的 while 循环来完成。如果不提供$step 中包含的内容以及将被解析为令牌的文件内容的示例,就很难确切地知道您正在尝试做什么。

    【讨论】:

    • 好的,我有一个错字。它应该是:for /f "tokens=2 delims=#" %%a in $step; do set devnum=%%a,以便它使用标记和分隔符遍历 $step 中包含的列表并将它们分配给 %%a。那是我在bash中无法弄清楚的。如何使用上面的参数进行循环。
    • 我已根据您对 `/f filenameset` 的编辑更新了答案。看一看。如果您提供额外的文件/令牌信息,我很乐意向您展示如何翻译令牌提取。
    猜你喜欢
    • 2021-11-07
    • 2021-12-30
    • 2014-12-18
    • 2012-10-13
    • 2015-12-03
    • 1970-01-01
    • 2021-03-12
    • 2018-02-22
    • 2017-04-26
    相关资源
    最近更新 更多