在不使用eval的情况下,是否可以使用变量绑定进行bash支架扩展?

在不使用eval的情况下,是否可以使用变量绑定进行bash支架扩展?,bash,brace-expansion,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 6

考虑以下脚本

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

有没有人知道一种不用评估就能获得想要的结果的方法

您可以使用
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
有没有人知道一种不用评估就能获得想要的结果的方法

您可以使用
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

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

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

来自bash手册:

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

考虑到变量展开是在大括号展开之后进行的,并且如果不使用
eval
,就无法导出不同的操作顺序,我必须得出结论:不,没有办法避免使用bash手册中的
eval

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


假设变量展开是在大括号展开之后进行的,并且如果不使用
eval
,就无法导出不同的操作顺序,那么我必须得出这样的结论:不,没有办法避免使用
eval

1)试图获得零填充。2) 问题特别要求括号扩展。@merlin2011,更新了答案谢谢你的回答,但与psmears的回答一样,它解决了问题,但没有解决根本问题。:)1) 试图得到零填充。2) 问题特别要求括号扩展。@merlin2011,更新了答案谢谢你的回答,但与psmears的回答一样,它解决了问题,但没有解决根本问题。:)谢谢您的回答,但它解决了问题,而没有解决根本问题。:)@merlin2011:这很公平——但值得更新您的问题,使其更加清晰:因为它目前说“有人知道不使用
eval
”而获得所需结果的方法吗?这可以理解为“如何获得大括号扩展将产生的输出”,而不是“我特别想使用大括号扩展”:)为了清晰起见,更新了问题。谢谢你的留言!:)谢谢您的回答,但它解决了问题,而没有解决根本问题。:)@merlin2011:这很公平——但值得更新您的问题,使其更加清晰:因为它目前说“有人知道不使用
eval
”而获得所需结果的方法吗?这可以理解为“如何获得大括号扩展将产生的输出”,而不是“我特别想使用大括号扩展”:)为了清晰起见,更新了问题。谢谢你的留言!:)如果要迭代可变长度的整数序列,请为循环使用C样式:
for((i=00;i可能的重复项);如果要迭代可变长度的整数序列,请为循环使用C样式:
for((i=00;i可能的重复项)