是否可以使用变量绑定进行bash大括号扩展而不使用eval?

时间:2015-10-26 07:14:15

标签: bash brace-expansion

考虑以下脚本。

#!/bin/bash

echo {00..99}
n=99
echo {00..$n}

此脚本的输出为:

00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
{00..99}

所需的输出是:

00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99

产生所需输出的一种解决方案是

eval echo  {00..$n}

不幸的是,此解决方案使用eval,如果可能,我希望避免使用eval

有没有人知道使用大括号扩展获得所需结果的方法,而不是table-layout: fixed;

3 个答案:

答案 0 :(得分:3)

来自bash手册:

  

扩展的顺序是:支撑扩展;代码扩展,参数和变量扩展,算术扩展和命令替换(以从左到右的方式完成);分词;和路径名扩展。

鉴于变量扩展是在大括号扩展之后发生的,并且没有使用eval就无法引发不同的操作顺序,我必须得出结论:不,没有办法避免使用{{ 1}}。

答案 1 :(得分:1)

  

有没有人知道如何在不使用eval的情况下获得所需的方法?

您可以使用seq命令,

seq -w -s ' ' 0 $n

<强>测试

sat $ seq -w -s " " 0 $n
00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99

答案 2 :(得分:1)

不确定这是否符合您的要求,因为它不使用大括号,但(至少使用GNU seq)以下内容会产生所需的输出:

$ n=99
$ seq -f%02.0f -s' ' 00 "$n"
00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99

“ - f”选项产生零填充,“ - d”使用空格分隔,而不是换行。