【问题标题】:Compare array elements and determine which element's string is the part of another in bash比较数组元素并确定哪个元素的字符串是 bash 中另一个元素的一部分
【发布时间】:2019-10-09 13:32:14
【问题描述】:

我有一个数组:

src_dir=( /etc /var/www /var /var/html /home/user)

我想要这样的输出:

/etc
/var contains /var/www /var/html
/home/user

到目前为止我已经尝试过:

src_dir=( /etc /var/www /var /var/html /home/user)
declare exclude
for src in ${src_dir[@]}; do
    if ! [[ " $src " =~ $exclude ]]; then
        exclude+=("$src")
    fi
done

【问题讨论】:

    标签: string bash compare contains


    【解决方案1】:

    试试这个Shellcheck-clean 代码:

    #! /bin/bash -p
    
    src_dir=( /etc /var/www /var /var/html /home/user)
    
    for src in "${src_dir[@]}"; do
        # Determine if $src contains other elements ($is_container), and which
        # elements contain it ($containers)
        is_container=0
        containers=()   # Elements that this element is part of
        for src2 in "${src_dir[@]}"; do
            if [[ $src2 == "$src" ]] ; then
                # Don't count an element as being part of itself
                continue
            elif [[ $src == *"$src2"* ]]; then
                is_container=1
                break
            elif [[ $src2 == *"$src"* ]] ; then
                containers+=( "$src2" )
            fi
        done
    
        # Skip elements that contain other elements.
        # Print elements elements that don't contain other elements, and any
        # elements that contain them.
        if (( is_container )) ; then
            continue
        elif (( ${#containers[*]} > 0 )) ; then
            printf '%s is contained in' "$src"
            printf ' %q' "${containers[@]}"
            printf '\n'
        else
            printf '%s\n' "$src"
        fi
    done
    
    • 正则表达式匹配 (=~) 在 Bash 中有一些奇怪之处,最好避免。使用[[ ... == ... ]] 进行简单的模式匹配就足够了。
    • 如果元素包含任何元素,则元素不会被列为包含在其他元素中。因此,如果您有(/home /home/user /home/user/dir),那么/home/user 将不会被列为包含在/home/user/dir 中。这可能不是您想要的。
    • 元素作为纯字符串进行比较。不尝试检查文件系统路径包含。因此,例如,/home/user 被认为包含在/home/user2 中。这可能不是您想要的。
    • 如果一个元素包含两个其他元素,它将被列为包含这两个元素。所以/home/user 都将被列为包含在/home/user 中。这可能不是您想要的。

    【讨论】:

      猜你喜欢
      • 2019-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多