因为这是工作,所以我无法显示我的真实例子;但将用一个虚拟的例子来说明我的问题。 我有一个运行以下命令的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
答案 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[@]}"
数组,以更好地灵活地动态添加参数。