Bash:测试变量是否存在于另一个变量中?

时间:2015-04-20 17:47:33

标签: regex linux bash shell wildcard

我有两个变量,都是一个由脚本移动的文件名列表。

变量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,所以如果有人能帮助我的话,那将会受到大力赞赏。

2 个答案:

答案 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