我有两个变量,都是一个由脚本移动的文件名列表。
变量1 : 由较大变量的“读取”循环生成。在任何给定时刻它只包含一个文件名。
var1 = pic1.jpg
var1 = pic2 duplicate.jpg
var1 = pic3(dup).jpg
var1 = pic4.jpg
var1 = subfolder / subfolder picture.png
如上所示,文件名可以包含空格,但并不总是。
变量2 :包含文件列表的字符串,每个文件名由\n
换行符分隔。
var2 = pic1.jpg
\n
pic2 duplicate.jpg\n
pic3(dup).jpg\n
pic4.jpg
我正在尝试测试是否可以在 var2 中找到 var1 的内容:
listcontains() {
for list_item in $1; do
# Does $list_item exist in $2?
if [[ "$list_item" =~ "$2" ]]; then
return 0
else
return "1"
fi
done
}
# Call function to see if var1 is in var2
if listcontains "$var1" "$var2"
then
# var1 is in var2; do stuff...
else
# Do different stuff...
fi
这个逻辑显然是错误的,或者语法错误,因为它现在总是返回不匹配:
does pic2 exist in pic2 duplicate.jpg
pic2.jpg
pic3(dup).jpg
pic3.jpg?
no
does pic3(dup).jpg exist in pic2 duplicate.jpg
pic2.jpg
pic3(dup).jpg
pic3.jpg?
no
我还在学习bash,所以如果有人能帮助我的话,那将会受到大力赞赏。
答案 0 :(得分:1)
=~
的右侧是正则表达式。左侧是与之匹配的字符串。
你的论点倒退了。你也没有考虑$list_item
中任何会丢掉你的比赛的正则表达式特殊字符。
您的$list_item
条目是部分文件名还是完整文件名?如果它们是完整的文件名,则可能更容易使用read
循环并对$var2
中的每一行进行完全匹配而不是这样(更好的方法是使用{{1}中的文件名的关联数组使匹配更快)。
据说使用字符串作为文件名是一个坏主意,因为它使用它们做任何事情(特别是如果它们可以有空格/等)很难做到。
答案 1 :(得分:0)
在这里,我向您展示它在控制台中的工作原理,然后您可以将代码复制到bash脚本文件中。
Frederick@Frederick-PC ~
$ for ele in "${var1[@]}"; do echo $ele; done
abc
def
Frederick@Frederick-PC ~
$ echo "$var2"
abc
ghi
Frederick@Frederick-PC ~
$ IFS=$'\n' read -rd '' -a array <<< "$var2"
Frederick@Frederick-PC ~
$ for ele in "${array[@]}"; do echo $ele; done
abc
ghi
Frederick@Frederick-PC ~
$ for ele in "${var1[@]}"; \
> do
> if [[ ${array[*]} =~ $ele ]]
> then
> echo "var2 contains $ele"
> else
> echo "var2 does not contain $ele"
> fi
> done
var2 contains abc
var2 does not contain def