2013-10-16 36 views
0

我有以下的shell腳本在bash中展開{..}中的變量?

cat test.sh  

j=00000001; 
k=00000005; 
l=$(echo {00000001..00000005}.jpg); 
m=$(echo {$j..$k}.jpg); 
ls $l 
ls $m 

這裏是輸出

./test.sh 
00000001.jpg 00000002.jpg 00000003.jpg 00000004.jpg 00000005.jpg 
ls: cannot access {00000001..00000005}.jpg: No such file or directory 

我的疑問是: 「爲什麼是$ M不工作的LS」。 以及如何使這項工作?

在此先感謝。 林

+0

使用*的/ usr/bin中/ SEQ *可變範圍。 –

+0

我已經使用seq來獲取列表'j = 00000001; k = 00000025; m = $(seq -w $ j $ k); echo $ m'但是我有沒有在列表中的每個元素之後附加.jpg的方式,而不是使用循環。 –

回答

1

序列擴展只發生在字面數字。序列擴展之後可變膨脹發生:

序列表達式的形式爲{x..y},其中x和y是任意整數 或單字符。當提供整數時,表達式 擴展到x和y之間的每個數字(包含)。當提供字符 時,表達式將擴展爲x和y(含)之間的按字典順序排列的每個字符 。請注意,x和y必須是相同的類型。

在任何其他擴展之前執行擴展擴展,並且在結果中保留特殊於其他擴展的任何字符 。這是嚴格的文本。 Bash不會對擴展 或大括號之間的文本應用任何語法解釋。

對於你的情況,你可以使用eval:

m=`eval echo {$j..$k}.jpg` 
+0

謝謝,這說明了它。現在我需要考慮其他方法來實現我所需要的。我的要求是從一大組jpg文件處理編號jpg文件的小序列子集,並在每次處理後增加子集。 –

+0

您可以使用eval:m ='eval echo {$ j .. $ k} .jpg' – SheetJS

+0

Thankyou very much.That工作正常。 –