2013-10-16 37 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工作正常。 –