与变量一起使用时,括号扩展不起作用

时间:2019-12-13 06:35:04

标签: regex shell unix

如果我在具有静态值(例如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个目录,名称为file_1.somefile_2.some,{{1 }},…file_3.some

如果用户希望从47到97获得目录,那么我想读取这些数字,进行存储,然后将其传递到file_100.some命令上方。

如果您还有其他选择也有帮助。

2 个答案:

答案 0 :(得分:0)

  1. 括号扩展和通配符与正则表达式大不相同
  2. 括号扩展发生在shell语法中定义的位置(不在引号中或参数扩展之后;请参见man bash
  3. 请不要使用ls获取数组中的文件列表:以下命令应该可以正常工作
arr=(path{1..10}*)

或者,arr=(path*),然后可以通过用[[测试要删除的对象进行过滤。

答案 1 :(得分:0)

您可以使用seq命令来完成此操作:

ls -d $WORKDIR/batch/somefilename_$(seq $segStart $segEnd).*

例如,如果您从1开始,并且希望其前导零(01),则可以使用seq的格式化输出,如下所示:

seq -f "%02.0f" $segStart $segEnd"