Bash 脚本:比较路径问题

Bash 脚本:比较路径问题

我正在编写遍历文件列表的 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

未经测试,您可能需要测试线上的报价。

否则,迭代是唯一的方法。

相关内容