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[@]}"
数组,以便更灵活地动态添加参数。
由于工作原因,我无法展示我的真实例子;但是会用一个虚拟的例子来解释我的问题。 我有一个 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[@]}"
数组,以便更灵活地动态添加参数。