【问题标题】:Is it possible to do a bash brace expansion using a variable bound without using eval?是否可以在不使用 eval 的情况下使用变量绑定进行 bash 大括号扩展?
【发布时间】:2015-10-26 07:14:15
【问题描述】:

考虑以下脚本。

#!/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 来获得所需结果的方法吗?

【问题讨论】:

标签: bash brace-expansion


【解决方案1】:

来自 bash 手册:

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

鉴于变量扩展出现在大括号扩展之后,并且如果不使用eval,就无法诱导不同的操作顺序,我不得不得出结论,不,没有办法避免使用eval

【讨论】:

    【解决方案2】:

    有没有人知道不用 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
    

    【讨论】:

    • 1) 试图获得零填充。 2)问题专门要求大括号扩展。
    • @merlin2011,更新了答案
    • 感谢您的回答,但与 psmears 的回答一样,它解决了问题而没有解决根本问题。 :)
    【解决方案3】:

    不确定这是否满足您的要求,因为它不使用大括号,但是(至少使用 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”使用空格而不是换行符来分隔。

    【讨论】:

    • 感谢您的回答,但它解决了问题而没有解决根本问题。 :)
    • @merlin2011:很公平 - 但值得更新您的问题以使其更清晰:因为它目前说“有没有人知道在没有eval 的情况下获得所需的方法?”,这可以被视为“我如何获得大括号扩展会产生的输出”,而不是“我特别想使用大括号扩展”:)
    • 为了清楚起见更新了问题。感谢您的注意! :)
    猜你喜欢
    • 2012-03-09
    • 1970-01-01
    • 2013-05-05
    • 1970-01-01
    • 1970-01-01
    • 2012-08-11
    • 2015-03-22
    相关资源
    最近更新 更多