【问题标题】:expanding variables inside {..} in bash? [duplicate]在 bash 中扩展 {..} 内的变量? [复制]
【发布时间】:2013-10-16 13:30:13
【问题描述】:

我有以下 shell 脚本

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

我的疑问是“为什么 ls $m 不起作用”。 以及如何使其发挥作用?

提前致谢。 林

【问题讨论】:

  • /usr/bin/seq 与可变范围一起使用。
  • 我已经使用 seq 来获取列表 j=00000001; k=00000025; m=$(seq -w $j $k); echo $m 但是除了使用循环之外,我有没有办法在列表中的每个元素之后附加 .jpg。

标签: linux bash list variables


【解决方案1】:

序列扩展只发生在文字数字上。序列扩展后发生变量扩展:

序列表达式采用 {x..y} 形式,其中 x 和 y 是 整数或单个字符。 当提供整数时,表达式 扩展到 x 和 y 之间的每个数字,包括 x 和 y。当字符是 提供时,表达式按字典顺序扩展到每个字符 在 x 和 y 之间,包括在内。请注意,x 和 y 必须是同一类型。

大括号扩展在任何其他扩展之前执行,以及任何字符 结果中保留了其他扩展的特殊性。它是严格的文本。 Bash 不对扩展的上下文应用任何句法解释 或大括号之间的文字。

对于您的情况,您可以使用 eval:

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

【讨论】:

  • 谢谢,这澄清了它。现在我需要考虑其他方法来实现我需要的东西。我的要求是从大量 jpg 文件中处理一小部分编号的 jpg 文件并递增每次处理后的子集。
  • 可以使用eval:m=eval echo {$j..$k}.jpg
  • 非常感谢。效果很好。
  • 我在我的 bash 中找不到 man eval。但是该命令在那里并且有效。
  • @xenoxen 因为它是一个内置的shell,你应该运行help eval 或搜索man bash 以找到eval
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-29
  • 2015-11-13
  • 1970-01-01
  • 2021-04-25
相关资源
最近更新 更多