在busybox中,默认的shell是ash,因此bash中的一些熟悉的技巧不可用。我想做的一件事是展开字母列表,例如,它将在 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
还有其他方法可以做这个灰吗?
答案1
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-style {a,b}
,而不是 zsh-style{1..10}
或{a..z}
ksh93/zsh/bash 中的更高级形式。
答案2
shellash
不支持大括号扩展。
使用 Perl,你可以这样做
perl -e 'print join("\n",a..z), "\n"'
其中第一个\n
(in join()
) 可以替换为您选择的分隔符。
如果您有jot
可用的实用程序,
jot -c - a z
答案3
如果您的 Busybox 安装附带了hush
shell,您可以使用它。它支持大括号扩展。