我有一个脚本,显示目录中包含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}$'
如何在花括号内部使用变量?
答案 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;