BASH:在 for 循环中使用 continue

Posted

技术标签:

【中文标题】BASH:在 for 循环中使用 continue【英文标题】:BASH: Using a continue in a for loop 【发布时间】:2019-09-02 13:52:58 【问题描述】:

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

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

但是,如果 name 等于某个属性(例如 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】:

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

第 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 的硬链接,则为真。

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

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

【讨论】:

感谢您的回复并详细说明每个命令行的用途。我的代码现在也按照我想要的方式运行。 $HOME 周围添加引号不会改变它是否会被扩展("$HOME"$HOME 都会被扩展,'$HOME' 不会),它的作用是防止如果它包含$IFS 的字符,则将其解析为多个单词的扩展结果。例如var="cat dog"; grep "$var" file 将在./file 中搜索“猫狗”,而var="cat dog"; grep $var file 将在./file./dog 中搜索“猫” @Aaron 好收获!我根据您的评论编辑了我的答案。

以上是关于BASH:在 for 循环中使用 continue的主要内容,如果未能解决你的问题,请参考以下文章

跳过“continue”

Bash之break和continue命令在循环中的作用

for循环中break与continue的区别

我可以在 Javascript for...in 和 for...of 循环中使用 continue 和 break 吗?

如何在嵌套的 for 循环中使用 continue 语句之类的东西?

while循环创建用户(区别for)