在busybox中,默认shell是ash,因此bash中一些熟悉的技巧不可用。我想做的一件事是展开一个字母列表,例如{a..z}
,它将扩展为a b c d e f g h i j k l m n o p q r s t u v w x y z
bash。还有另一种方法来处理这种灰烬吗?
POSIXly(和busybox)以及在基于ASCII的系统上(我认为在EBCDIC系统上从来没有发现busybox):
letters() { awk 'BEGIN{for(i=97;i<123;i++)printf "%c\n", i}'; }
将扩展到该字母列表,每行一个,所以假设您尚未修改$IFS
,
cmd $(letters)
将是将该列表作为单独的参数传递给的一种方法cmd
。正如你所用做ksh93
/ zsh
/bash
的cmd {a..z}
。
这几乎不是一个改进
letters() { printf '%s\n' a b c d e f g h i j k l m n o p q r s t u v w x y z; }
尽管。为了能够完成的功能foo{a..z}bar
,您可以定义:
letters() { printf "${1-%s\n}" a b c d e f g h i j k l m n o p q r s t u v w x y z; }
相反,将其称为:
cmd $(letters 'foo%sbar\n')
您可以通过执行以下操作来扩展这种方法:
format() { awk -v format="$1" '{printf format, $0}' ;}
然后执行:
$ seq 97 100 | format 'foo%cbar\n'
fooabar
foobbar
foocbar
foodbar
$ seq 4 | format '%04d\n'
0001
0002
0003
0004
(尽管后者也可以写成seq -w 0004
)
seq
不是POSIX命令,但busybox
它附带了它。
请注意,busybox默认情况下sh
基于,ash
但是可以在构建时配置为使用hush
不支持括号扩展的基于-shell。但这仅仅是csh样式{a,b}
,而不是zsh样式{1..10}
,{a..z}
或者是ksh93 / zsh / bash中更高级的形式。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句