regex - 与变量一起使用时,大括号扩展不起作用
问题描述
如果我在具有静态值(即27..97
)的 shell 中运行此命令,它可以正常工作并提供所需的输出
>ls -d $WORKDIR/batch/somefilename_{27..97}.* 2>/dev/null
somefilename_27.sometxt
somefilename_28.sometxt
somefilename_29.sometxt
..
somefilename_97.sometxt
但是,如果我想包含变量或将参数传递给正则表达式,那么我会收到错误消息
ls: cannot access /home/work/batch/somefilename_{27..96}.*: No such file or directory
但这不是真的,因为该文件存在,但不知何故,正则表达式无法正常工作。
>segStart="27"
>segEnd="96"
>myvar="$segStart..$segEnd"
>echo $segStart
27
>echo $segEnd
96
>echo $myvar
27..96
ls -d $WORKDIR/batch/somefilename_{$myvar}.*
"ls: cannot access /home/work/batch/somefilename_{27..96}.*: No such file or directory"
>array=($(ls -d $WORKDIR/batch/somefilename_$myvar.* 2>/dev/null))
>len=${#array[*]}
>echo $len
0
注意:我试图将名称在两个整数之间的目录名称存储在一个数组中:例如,有 1-100 个目录可用 name file_1.some
, file_2.some
, file_3.some
, ... file_100.some
。
如果用户想要从 47 到 97 获取目录,那么我想读取这些数字,存储它们,并将它们传递给上面的ls
命令。
如果您有任何其他选择也会有所帮助。
解决方案
- 大括号扩展和通配符与正则表达式有很大不同
- 大括号扩展发生在 shell 语法中的定义位置(不在引号中或在参数扩展之后;请参阅
man bash
) - 请不要
ls
用于获取数组中的文件列表:以下应该可以正常工作
arr=(path{1..10}*)
或者,arr=(path*)
然后您可以通过测试[[
您想要摆脱的那些进行过滤。
推荐阅读
- google-apps-script - 从 Google Apps 脚本更新 Salesforce 记录
- neural-network - Caffe CNN:用于分层分类的多个分层损失
- complexity-theory - BigInteger 连续方法的复杂度如何计算?
- java - 如何将查询传递给 FirestoreRecyclerOptions?
- php - 从两列建议自动完成的Mysql查询?
- javascript - 函数中的条件选择
- javascript - 如何在父页面上打开 ChildPage 的模态弹出窗口?
- python - 如何处理 pywinauto 或 pyautoit 中的海拔错误?
- python - 如何计算排序列表中单词的频率?
- python - 如何让列表中的每个元素都降价 10% [Python]?