【问题标题】:Bash: test if a variable exists within another variable?Bash:测试一个变量是否存在于另一个变量中?
【发布时间】:2015-04-20 17:47:33
【问题描述】:

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

变量 1: 由较大变量的“读取”循环生成。在任何给定时刻,它只包含一个文件名。

var1 = pic1.jpg

var1 = pic2 副本.jpg

var1 = pic3(dup).jpg

var1 = pic4.jpg

var1 = 子文件夹/子文件夹图片.png

如上所示,文件名可以包含空格,但并非总是如此。

变量 2:包含文件列表的字符串,每个文件名由 \n 换行符分隔。

var2 = pic1.jpg \n pic2 duplicate.jpg \n pic3(dup).jpg \n pic4.jpg

我正在尝试测试 var1 的内容是否可以在 var2 中找到:

    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,所以如果有人可以帮助我,我将不胜感激。

【问题讨论】:

    标签: regex linux bash shell wildcard


    【解决方案1】:

    =~ 的右侧是正则表达式模式。左边是匹配它的字符串。

    你的论点倒退了。您也没有考虑到 $list_item 中的任何正则表达式特殊字符,这会导致您的匹配失败。

    您的$list_item 条目是部分文件名还是完整文件名?如果它们是完整的文件名,那么使用read 循环并与$var2 中的每一行进行精确匹配可能会更容易而不是这样(更好的是使用$var2 中的文件名关联数组来进行匹配快得多)。

    说使用字符串作为文件名是个坏主意,因为它使对它们做任何事情(尤其是如果它们可以有空格/等)变得几乎不可能。

    【讨论】:

    • 你是对的!我切换了测试一侧的参数,并将其固定为我期望的输出。这些项目是完整的文件名。
    【解决方案2】:

    这里我向你展示它是如何在控制台中工作的,然后你可以将代码复制到一个 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-06
      • 2017-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多