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的主要内容,如果未能解决你的问题,请参考以下文章
我可以在 Javascript for...in 和 for...of 循环中使用 continue 和 break 吗?