【问题标题】:Looping through different files/subdirectories with bash使用 bash 循环遍历不同的文件/子目录
【发布时间】:2021-06-29 18:40:56
【问题描述】:

我正在尝试将 cshell 脚本转换为 bash 脚本。为了编译不同子目录中的一些文件,它使用foreach

 cd $BLDSRCDIR
 foreach file ( $flist )
    $myCC -c $myCFLAGS $file.c -o $BLDDIR/$file.o
 end for

因为bash没有foreach,我试过了:

 for file [ $flist ] in
 do
    $myCC -c $myCFLAGS $file.c -o $BLDDIR/$file.o
 done

但是这种语法不正确(syntax error near unexpected token [')。可能有不止一个解决方案,但我想知道一种简洁的方法来循环(和编译)不同子目录中的所有文件。

【问题讨论】:

    标签: bash loops


    【解决方案1】:
    for file in $flist ; do
        "$myCC" -c $myCFLAGS "$file.c" -o "$BLDDIR/$file.o"
    done
    

    但是使用数组会更干净。

    for file in "${flist[@]}" ; do
        "$myCC" -c "${myCFLAGS[@]}" "$file.c" -o "$BLDDIR/$file.o"
    done
    

    【讨论】:

      【解决方案2】:

      首先,要循环的项目不包含任何标点符号;如果你按字面意思提供它们,它看起来像这样:

      for file in file1 file2 file3; do
        ...
      done
      

      其次,你如何填充变量flist?理想情况下,它应该是一个数组,可以使用如下文字值创建:

      flist=(file1 file2 file3...)
      

      但是,如果您将它作为其他命令的输出,那么将其转换为数组需要更多的工作。

      你会像这样循环遍历这样一个数组:

      for file in "${flist[@]}"; do
      ...
      done
      

      您可以将 flist 设为文件名字符串并使用 for file in $flist; do(注意缺少引号),但如果任何文件名包含空格等,则会中断。

      【讨论】:

      • flist的内容是直接在前面的语句中声明的(脚本很长)。谢谢。
      • 如果它是 csh 中的列表 (set flist=(name1 name2 name3)),那么等效的 bash (flist=(name1 name2 name3)) 会为您提供一个数组,您需要使用 "${flist[@]}" 语法进行循环。
      【解决方案3】:

      第一个问题很简单,bash 中 for 循环的语法是:

      for file in [ $flist ]
      do
          $myCC -c $myCFLAGS $file.c -o $BLDDIR/$file.o
      done
      

      但是下一个问题是 bash 没有 -c 选项,而且我对 c shell 不熟悉,所以我不能 100% 确定你在这里尝试做什么。

      希望这会有所帮助,但如果您需要其他帮助,请告诉我您要对每个文件具体做什么,我可以在 bash 中为您举一个示例

      【讨论】:

      • -c 标志用于编译器,但我现在明白我做错了什么。谢谢。
      猜你喜欢
      • 2012-07-25
      • 2013-12-03
      • 2013-09-20
      • 1970-01-01
      • 2022-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多