【问题标题】:bash brace feature fails when used with variables? [duplicate]bash 大括号功能在与变量一起使用时失败? [复制]
【发布时间】:2016-03-31 05:07:02
【问题描述】:

我正在尝试使用 bash 以模式 *{num1..num2}.txt 列出当前目录中的文件

我尝试过使用 bash 大括号功能

ls *{10..20}.txt

,这是有效的。但是,当我先设置变量 num1 和 num2 然后使用

num1=10
num2=20
ls a{${num1}..${num2}}.txt

,实际上失败了。我用bash -x调试,发现bash自动给字符串a{${num1}..${num2}}.txt加上单引号,很奇怪。

你有什么解决办法吗?

谢谢。

【问题讨论】:

  • 尽可能忽略接受的答案。确实没有必要使用eval(或者在可以避免的情况下是一个好主意)。如果您需要运行单个命令并将它们全部作为参数,则可以将这些条目与循环一起累积在一个数组中。
  • 你的意思是下面的循环吗? all=; for i in {10..20}; do all="$all $(ls *$i.nc)"; done; echo $all
  • 那个循环由于不同的原因是错误的。all=(); for i in {10..20}; do all+=( *"$i.nc" ); done; echo "${all[@]}".

标签: bash


【解决方案1】:
$ n=3; echo {"$n"..5}
{3..5}

所以你需要评估结果

$ n=3; eval echo {"$n"..5}
3 4 5

【讨论】:

  • 强制性“评估是邪恶的”评论。
  • 很多人说“eval 是邪恶的”。我通常不使用它,所以我不知道为什么。但至少它为这个问题提供了一个解决方案:D
  • 也许不适合这个用途,但很容易滥用它。
猜你喜欢
  • 1970-01-01
  • 2019-04-11
  • 2019-03-10
  • 2019-01-22
  • 2012-03-09
  • 2013-10-26
  • 1970-01-01
相关资源
最近更新 更多