string - 比较数组元素并确定哪个元素的字符串是 bash 中另一个元素的一部分
问题描述
我有一个数组:
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
解决方案
试试这个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)
then/home/user
将不会被列为包含在/home/user/dir
. 那可能不是你想要的。 - 元素作为纯字符串进行比较。不尝试检查文件系统路径包含。因此,例如,
/home/user
被认为包含在/home/user2
. 那可能不是你想要的。 - 如果一个元素包含两个其他元素,它将被列为包含这两个元素。所以两者
/home
和/user
都将被列为包含在/home/user
. 那可能不是你想要的。
推荐阅读
- swift - 将日期组件格式化为具有“n”个字符的字符串的直接方法
- video - ffmpeg concat 并保留元数据流
- c# - ObservableCollection 和 ProgressBar 不能一起工作
- java - 如何使用java连接到远程桌面上的ms sql server(需要用户登录名和密码)?
- mysql - Vb.Net - 使用 MySQL 存储过程的 DATE_FORMAT 上的“字典中不存在给定的键”
- python - 写入文件时使用额外内存的 Python 多处理
- javascript - javascript momentJS 在添加天数时回退到 js Date()
- reactjs - 创建 ReactJs Hello world 程序时出错
- swift - 为什么我使用 CASpringAnimation 时我的图像没有动画?
- python - 网络爬虫数组错误:“列表索引超出范围”