phi*_*ole 5 bash shell permutation brace-expansion
我想生成最长长度的所有字母排列n
例如,对于参数2我想获得一个类似的列表
a
aa
..
az
...
z
za
..
zz
Run Code Online (Sandbox Code Playgroud)
我尝试使用 for 循环n通过重复{a..z} ^1并将其附加到变量来生成越来越大的大括号扩展。但这似乎不起作用。
a
aa
..
az
...
z
za
..
zz
Run Code Online (Sandbox Code Playgroud)
这种情况eval可能是您最好的选择。只要您严格控制 的内容,就不存在安全问题,brace_string并且它允许您构建可以执行您想要的操作的大括号扩展列表。
#!/bin/bash
make_list() {
brace_string=""
for ((i=0 ; i < $1 ; i++)) ; do
brace_string+="{a..z}"
eval printf "'%s\n'" "${brace_string}"
done
}
make_list "$1" | sort
Run Code Online (Sandbox Code Playgroud)
{1..$i}在不带变量的变量中构建大括号扩展列表的问题eval是 bash 解析器在扩展变量之前评估语法。这意味着{1..$i}它只是被视为字符串,因为$i它不是单个字符或整数(稍后会被整数替换,但 bash 无法预见未来)。eval通过让您执行所有解析步骤两次来解决此问题,这意味着$i可以在第一次解析时替换,然后大括号扩展在第二次解析时有效。而且,与上面的示例更相关的是,"$brace_string"在第一次解析时不会被视为大括号扩展,因为 bash 进行语法分析时该变量尚未被替换,但可以在第二次解析时通过eval.
链式支撑扩展不能很好地扩展。你最好使用这样的函数:
# Usage: perms n [prefix]
perms() {
if (($1 < 1)); then
return
fi
for pfix in "$2"{a..z}; do
printf '%s\n' "$pfix"
perms $(($1 - 1)) "$pfix"
done
}
Run Code Online (Sandbox Code Playgroud)
$ perms 2
a
aa
ab
ac
...
Run Code Online (Sandbox Code Playgroud)
但如果你坚持这样做,你应该这样做:
# Usage: perms n
perms() {
printf -v brace_exp '{a..z}%*s' $(($1 - 1))
brace_exp=${brace_exp// /'{,{a..z}}'}
eval "printf '%s\n' $brace_exp"
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
159 次 |
| 最近记录: |