我正在编写遍历文件列表的 bash 脚本。我需要将这些文件的路径与包含受限路径的数组进行比较。
在 for 循环中我得到了这样的文件的路径:
dname="$(dirname "$i")";
这将返回一个相对路径,如 path/to/file
受限路径列表存储在数组中:
restricted=(
path/to/file
another/path/to/file
);
然后我尝试比较路径:
if [[ "${restricted[*]}" = "$dname" ]]; then
//do some things
fi
但这种比较似乎不起作用。
您能建议如何解决这个问题吗?
谢谢。
答案1
您需要迭代数组的元素,例如
for i in "${restricted[@]}"
do
if [ "$i" == "$ddame" ] ; then
echo "Found"
fi
done
答案2
Iain 的回答是最官方的也是最好的。我写脚本的时候就是用的这个。不过,这里有一个替代方案。大写的“W”也没什么问题,但我还是不推荐它。
if $(echo "${restricted[@]}" | grep -sw "${dname}") ; then
echo "found"
else
echo "not found"
fi
这将回显您的数组,并将输出通过管道传输到 grep,后者将仅匹配整个单词 ( -w
) 并且不会提供任何输出 ( -s
),而是通过退出代码指示有/没有匹配。该退出代码是您用作 if 语句的测试的代码。
请注意,此方法与您发布的文件名示例具有相同的明显问题=~
。它将匹配包含您的字符串作为子组件的目录。例如: /路径/到/文件/子文件夹和/usr/local/路径/文件都会匹配。(对于 grep 来说,斜杠算作非单词分隔符)您用于文件名-w
的部分匹配选择器将遇到同样的问题。=~
答案3
您不能直接将数组与变量进行比较;它会扩展为:
[ "one two three" = "two" ]
看到这里,我相信您已经看出了问题所在!
也许:
case "${restricted[*]}" in
$ddname|* $ddname|* $ddname *|$ddname *)
# do something
;;
esac
未经测试,您可能需要测试线上的报价。
否则,迭代是唯一的方法。