【问题标题】:bash - brace expansion not expanding?bash - 大括号扩展不扩展?
【发布时间】:2016-10-31 08:09:36
【问题描述】:

在 Kubuntu 15.10 上

echo $BASH_VERSION
4.3.42(1)-release

我试试

reps=1
threads={1}{10..60..10}

for((r=0;r<$reps;r++))
do
    tCount=0
    for t in $threads
    do
        echo "t=$t, tCount=${tCount}"
        #do something funny with it
        ((tCount++))
    done
done

它会产生一行

t={1}{10..60..10}, tCount=0

如何让它工作?

编辑

我期待

t=1, tCount=0
t=10, tCount=1
t=20, tCount=2
t=30, tCount=3
t=40, tCount=4
t=50, tCount=5
t=60, tCount=6

更新

注意threads=({1}{10..60..10})

然后for t in ${threads[@]}

将在10..60..10 范围前加上字符串{1}

(即{1}10,{1}20,..,{1}60

【问题讨论】:

  • 我推荐使用threads=$(echo {1}{10..60..10})
  • @hek2mg 这以{1} 为前缀10,20,..,60(即{1}10,{1}20,..,{1}60。这也是为什么这不是重复问题的原因。
  • {1} 根本不是必需的。使用它的原因是什么?

标签: bash range brace-expansion


【解决方案1】:

{1} 表达式只是一个字符串,因为它不符合大括号扩展语法:

序列表达式采用{X..Y[..INCR]} 的形式,其中 X 和 Y 是整数或单个字符,INCR(可选增量)是整数。

大括号展开是在变量展开之前进行的,所以不能只引用一个变量来展开大括号:

展开顺序为:大括号展开;波浪号扩展、参数和变量扩展、算术扩展和命令替换(以从左到右的方式完成);分词;和文件名扩展。

是直接写大括号展开,还是使用eval(一般不推荐)。

例子:

tCount=0
for t in {1,{10..60..10}}; do
  echo "t=$t tCount=$tCount"
  (( tCount++ ))
done

【讨论】:

  • 谢谢!您能否详细说明为什么“通常不推荐”eval
  • 应该使用命令替换而不是eval: threads=$(echo {10..60..10})
  • @hek2mgl 或在本例中为threads=({1,{10..60..10}})。再次,请详细说明为什么这个“应该”被使用。
  • 这将产生一个数组。
  • @User1291, much has been written 关于不好的eval,请阅读这些帖子。
猜你喜欢
  • 1970-01-01
  • 2012-02-07
  • 1970-01-01
  • 2016-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多