首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Glob多位数,没有脚本范围的商店extglob

Glob多位数,没有脚本范围的商店extglob
EN

Stack Overflow用户
提问于 2021-02-16 21:24:00
回答 2查看 130关注 0票数 1

我正在编写一个shell脚本,它可以迭代一些文件。

代码语言:javascript
复制
for f in $folder-*-something; do
    echo $f
done

一般情况下都可以,但我只想显示数字,所以我不想与$folder-1-2-something匹配

完全符合要求的事情就是

代码语言:javascript
复制
#!/usr/bin/env bash
shopt -s extglob

if [ $1 -eq 0 ]; then
    for f in $folder-+([[:digit:]])-something; do
        echo $f
    done
fi

extglob不能只在if-block中打开-它返回syntax error near unexpected token `(' (在某个地方,我读了一个简短的摘要为什么,但我找不到它了)。如果这是可行的,我可以在完成相关的行后reset it

问题:我正在扩展的脚本是一个大型开源项目的一部分,我不想在整个>500行脚本中打开选项,因为这可能会干扰其他代码。

我现在倾向的选择是使用*-globbing并跳过不相关的条目。

  1. 有更好的方法吗?
  2. 在哪里可以找到关于shopt及其怪癖的好的深度信息?我发现很多网站都在谈论所有的选项,但我甚至找不到两行描述,说明为什么要把它直接放在shebang之后。
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-02-17 00:07:02

使用find而不是球形:

代码语言:javascript
复制
find . -regex "./$folder-[0-9]+-something" |
while IFS= read -r f; do
    echo "$f"
done
票数 2
EN

Stack Overflow用户

发布于 2021-02-16 23:57:45

解决方法之一是将匹配扩展模式的文件名存储到数组中,然后取消设置extglob。之后,必须使用数组,而不是扩展模式:

代码语言:javascript
复制
shopt -s extglob
files=("$folder"-+([[:digit:]])-something)
shopt -u extglob

if [ "$1" -eq 0 ]; then
    for f in "${files[@]}"; do
        echo "$f"
    done
fi

或者,如果您想恢复状态:

代码语言:javascript
复制
saved_state=$(shopt -p)
shopt -s extglob
files=("$folder"-+([[:digit:]])-something)
eval "$saved_state"
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66232378

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档