2017-10-04 65 views
0

我想替換下面的循環在我的bash腳本之一:通過類似混合括號和globing是bash的

for i in $(seq 1 $nb) do 
    grep -h 'my pattern' $mydir/$my_dir_prefix$i/$myfile_prefix* 
done 

grep -h 'my pattern' $mydir/$my_dir_prefix${1,$nb}/$myfile_prefix* 

但它失敗...根據在我試圖放雙引號的地方,我得到了不同的結果,但從來沒有正確的結果。

我在類似的主題周圍看到的所有答案都沒有解決這個問題。 有什麼想法?

+0

Brace擴展不能包含變量。 – chepner

回答

0

編輯:首先溶液將只爲數字1-9,加入更好一個

綜觀bash manual

序列表達式的形式爲{x..y [.. incr]},其中x和y是 ,可以是整數或單個字符。

...

括號擴展是任何其他擴展

所以變量是從字面上處理之前進行。

解決方案1(將只能用於數字1-9)

但是,你應該能夠使用[]水珠你的目的:

grep -h 'my pattern' $mydir/$my_dir_prefix[1-$nb]/$myfile_prefix* 

關於雙引號,你可以添加他們無處不在,但周圍沒有水珠的:

grep -h 'my pattern' "$mydir/$my_dir_prefix"[1-$nb]"/$myfile_prefix"* 

解決方案2.

您可以啓用慶典extglob option和使用擴展模式匹配:

shopt -s extglob 
grep -h grep -h 'my pattern' "$mydir/$my_dir_prefix"@($(seq -s \| 1 $nb))"/$myfile_prefix"* 
+0

太好了,那正是我在找的東西......我不知道爲什麼我會把注意力放在大括號上,而不是用glob的唯一材料做所有事情 – leolivier

0

只要把grep圈外:

grep -h 'my pattern' $(for i in $(seq 1 $nb); do find $mydir -wholename "$mydir/$my_dir_prefix$i/$myfile_prefix*"; done) 

你會碰到與古怪命名的文件的問題(例如包含換行符或其他空格),但是原始解決方案中存在相同的問題。