BASH: 在 for 循环中使用 continue

BASH: Using a continue in a for loop

由于工作原因,我无法展示我的真实例子;但是会用一个虚拟的例子来解释我的问题。 我有一个 BASH 脚本,其中 运行 执行以下命令:

for name in $HOME/data/individual-*-lookup; do
    $name
done

但是,如果名称等于某个属性(例如 John)。我希望 for 循环跳过这个名字。我试过以下代码;但它似乎仍然 运行 所有选项:

#! /bin/bash

for name in $HOME/data/individual-*-lookup; do  
    if ["$name" == "$HOME/data/individual-john-lookup"]; then
        continue
    fi
    $filename

done

我在您的代码中修复的几个问题:

  • 第 3 行,$HOME 周围缺少引号,以防止值被解析为多个单词,如果它包含 $IFS 环境变量的字符。
    (参见:ShellCheck: SC2231):

    for name in $HOME/data/individual-*-lookup; do
               ^     ^
               "$HOME"/data/individual-*-lookup
    
  • 第 4 行,测试括号内缺少空格:

    if ["$name" == "$HOME/data/individual-john-lookup"]; then
        ^                                            ^
    
  • 第4行,混合单括号[ condition ]POSIX语法和==Bash字符串相等语法

    if ["$name" == "$HOME/data/individual-john-lookup"]; then
       ^        ^^                                    ^
    
  • 第 7 行,缺少双引号 " $filename

     $filename
    ^         ^
     "$filename"
    

修复重构版本:

#!/usr/bin/env bash

filename=() # Array of a command with its parameters

for name in "$HOME"/data/individual-*-lookup; do
  # Continue to next name if file is physically same,
  # regardless of path string syntax
  [[ $name -ef "$HOME/data/individual-john-lookup" ]] && continue
  filename=(: "$name") # Command and parameters ":" is a dummy for command name
  "${filename[@]}"     # Run the command with its parameters
done

测试 -ef 比较以检查文件在物理上是否相同而不是字符串是否相等,因此如果文件路径扩展但语法略有不同,这无关紧要。

-ef 条件运算符是一个 Bash 特征:

FILE1 -ef FILE2 True if file1 is a hard link to file2.

由于测试后只有一条语句,可以使用较短的test && command代替if test; then; command; fi

$filename 命令调用被替换为 "${filename[@]}" 数组,以便更灵活地动态添加参数。