![Bash:文件中的变量匹配正则表达式](https://linux22.com/image/165720/Bash%EF%BC%9A%E6%96%87%E4%BB%B6%E4%B8%AD%E7%9A%84%E5%8F%98%E9%87%8F%E5%8C%B9%E9%85%8D%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F.png)
我的脚本如下:
- 搜索某个路径下所有可用的 isos
- 将 isos 名称与文件中的列表进行比较
- 仅返回匹配项
简而言之,代码是:
isos_found=() # here we save the isos
isos_search=<find isos>
mapfile -t supported_isos < supported_systems # see below
for iso in "${isos_search[@]}" ; do
[[ "${supported_isos[@]}" =~ "$(basename "$iso")" ]] && isos_found+=("$iso")
done
supported_systems
包含以下内容的文件在哪里:
clonezilla-live-2.6.1-25-amd64.iso
debian-live-10.0.0-amd64-xfce+nonfree.iso
linuxmint-19.1-cinnamon-64bit.iso
linuxmint-19.1-xfce-32bit.iso
lubuntu-18.04-alternate-amd64.iso
现在我希望该文件supported_systems
的内容如下:
clonezilla*
debian*
linuxmint*
lubuntu*
因此,我必须仅匹配发行版的名称,而无需对每个版本/发行版进行编码。
使用与上面类似的代码 ( "${supported_isos[@]}" =~ "$(basename "$iso")"
) 这可能吗?如果没有,我愿意接受建议。
答案1
假设您的supported_systems
文件包含前缀字符串(不是模式)就像
clonezilla
debian
linuxmint
lubuntu
然后,您可以简单地读取这些字符串并在文件全局匹配中使用它们,而不是首先尝试查找所有 ISO 文件,然后手动检查它们是否匹配某些模式。
shopt -s dotglob nullglob globstar
isos=()
while IFS= read -r prefix; do
isos+=( ./**/"$prefix"-*.iso )
done <supported_systems
printf '%s\n' "${isos[@]}"
如果您确实想先查找所有 ISO 文件,然后遍历它们以查找与任何前缀匹配的文件,那么您可以使用
shopt -s dotglob nullglob globstar
isos=( ./**/*.iso )
while IFS= read -r prefix; do
for iso in "${isos[@]}"; do
if [[ $iso =~ /"$prefix"-[^/]*$ ]]; then
matched_isos+=( "$iso" )
fi
done
done <supported_systems
printf '%s\n' "${matched_isos[@]}"
在这里,正则表达式/"$prefix"-[^/]*$
将匹配以给定$prefix
(后跟-
)开头的任何基本名称。