我正在研究遍历文件列表的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线上进行报价。
否则,迭代是唯一的方法。