Bash脚本:比较path问题

我正在研究遍历文件列表的bash脚本。 我需要比较这个文件的path与包含受限path的数组。

在for循环中,我得到一个像这样的文件的path:

dname="$(dirname "$i")"; 

这会返回一个相对path,如path / to / file

受限path的列表存储在数组中:

 restricted=( path/to/file another/path/to/file ); 

然后我试图比较path:

 if [[ "${restricted[*]}" = "$dname" ]]; then //do some things fi 

但是,比较似乎并不奏效。

你可以请build议如何解决这个问题?

谢谢。

你需要迭代数组的元素

 for i in "${restricted[@]}" do if [ "$i" == "$ddame" ] ; then echo "Found" fi done 

Iain的答案是官方和最好的答案。 当我编写脚本时,这就是我使用的。 但是,这是另一种select。 首都“W”并没有错,但我仍然不会推荐它。

 if $(echo "${restricted[@]}" | grep -sw "${dname}") ; then echo "found" else echo "not found" fi 

这回声你的数组,输出到grep,这将只匹配整个字( -w ),并将不会提供输出( -s ),而是通过退出代码指示有/不匹配。 那个退出代码就是你用作if语句testing的东西。

请注意,此方法与您为文件名发布的示例相同。 它将匹配包含您的string作为子组件的目录。 例如: / path / to / file /子文件夹/ usr / local / path / to / file都将匹配。 (对于grep的-w ,斜杠是非单词分隔符)你用于文件名的=~的部分匹配select符会有相同的问题。

你不能直接比较数组和variables; 它扩展到:

 [ "one two three" = "two" ] 

看这个,我相信你可以看到这个问题!

也许:

 case "${restricted[*]}" in $ddname|* $ddname|* $ddname *|$ddname *) # do something ;; esac 

未经testing,您可能需要在testing线上进行报价。

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