重击:在for循环中使用Continue

时间:2019-09-02 13:52:58

标签: bash for-loop if-statement continue

因为这是工作,所以我无法显示我的真实例子;但将用一个虚拟的例子来说明我的问题。 我有一个运行以下命令的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

1 个答案:

答案 0 :(得分:3)

我在您的代码中修复的一些问题:

  • 第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如果file1是到file2的硬链接,则为true。

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

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