我想生成长度不超过n
的所有字母排列
例如,对于参数2
,我希望获得如下列表
a
aa
..
az
...
z
za
..
zz
我尝试使用for循环来生成n
越来越大的括号扩展,方法是重复{a..z}
^1并将其附加到一个变量中,但这似乎不起作用。
OUT=""
# loop from 1 to first argument
for ((i=1; i<=$1; i++))
do
OUT+=$(echo $(printf '{a..z}%.0s' {1..$i}))
done
OUT=$(echo $OUT | sort)
echo $OUT
3条答案
按热度按时间gk7wooem1#
链式大括号展开不能很好地缩放。最好使用如下函数:
但如果你坚持,这就是你应该怎么做:
ijxebb2r2#
在这种情况下,
eval
可能是您最好的选择,只要您严格控制brace_string
的内容,并且它允许您构建一个可以执行任何操作的大括号扩展列表,就不会存在安全问题。{1..$i}
或在没有eval
的变量中构建大括号扩展列表的问题在于bash解析器在扩展变量之前评估语法,这意味着{1..$i}
被当作字符串处理,因为$i
不是单个字符或整数(稍后它会被一个整数 * 替换 *,但是bash不能预见未来)。eval
通过允许您将所有解析步骤执行两次来解决这个问题,这意味着$i
可以在第一次解析时被替换,然后大括号扩展在第二次解析时有效。"$brace_string"
在第一次解析时不会被视为大括号扩展,因为变量还没有被time bash替换,执行语法分析,但它可以在第二次解析时通过eval
处理。c6ubokkw3#
试试这个Shellcheck-clean pure Bash代码:
通过以字母大小的组输出最大长度排列,可以使代码显著更快(大约4倍):