在Bash脚本中使用大括号内的int变量

时间:2017-03-06 00:11:50

标签: linux bash

我有一个脚本,显示目录中包含5个或更少字符的文件名:

#!/bin/bash

ls | egrep '^.{0,5}$'

示例目录:

foobar
foo
bar

输出:

foo
bar

但是当我尝试使用变量代替5时,如下所示,我没有输出。没有错误,所以我假设它还在寻找某种范围。但不是0-5。

#!/bin/bash

declare -i num=5
ls | egrep '^.{0,$num}$'

如何在花括号内部使用变量?

3 个答案:

答案 0 :(得分:5)

卷曲括号不是问题,它是单引号。使用双引号 - ''内的变量不会被shell扩展:

ls | egrep "^.{0,$num}$"

另见:

答案 1 :(得分:1)

Don't parse the output of ls;只需使用匹配名称之外的所有字符的模式,其中包含6个或更多字符:

shopt -s extglob
printf '%s\n' !(??????*)

如果您需要可变长度模式,请使用循环构建它:

pat=; for ((i=0; i<=$num; i++)); do pat+=?; done
printf '%s\n' !($pat*)

# POSIX-compatible variant
i=0
pat=?
while [ "$i" < "$num" ]; do
  printf '%s\n' $pat
  pat+=?
done

或者,匹配所有文件并使用正则表达式匹配过滤它们。

for f in *; do
    [[ $f =~ ^.{0,$num}$ ]] || continue
    printf '%s\n' "$f"
done

答案 2 :(得分:0)

 #/ bin / sh&#xA; FIVE = 5&#xA; ls | egrep“^。{0,$ {FIVE}} $”&#xA;  
&#xA;&#xA;

使用变量时只需要使用引号。

&#XA;