2017-03-06 68 views
1

我有一個顯示的每個文件在具有含5首或更少個字符的文件名的目錄中的腳本:在bash腳本使用大括號內INT變量

#!/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
#/bin/sh 
FIVE=5 
ls | egrep "^.{0,${FIVE}}$" 

你只需要使用引號時使用變量。

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