全局多个数字,无需脚本范围的 shopt extglob

问题描述

我正在编写一个遍历一些文件的 shell 脚本。

for f in $folder-*-something; do
    echo $f
done

通常很好,但我只想glob for numbers,所以我不想匹配$folder-1-2-something

完全按预期工作的东西是

#!/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 之后。

解决方法

一种解决方法是将与扩展模式匹配的文件名存储到一个数组中,然后取消设置 <?php $depDate = $_REQUEST["depDate"]; echo $depDate; ?> 。之后,必须使用数组,而不是扩展模式:

extglob

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

shopt -s extglob
files=("$folder"-+([[:digit:]])-something)
shopt -u extglob

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

使用 find 代替通配符:

find . -regex "./$folder-[0-9]+-something" |
while IFS= read -r f; do
    echo "$f"
done