如何扩展 ash 中的字母/数字列表?

如何扩展 ash 中的字母/数字列表?

在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 安装附带了hushshell,您可以使用它。它支持大括号扩展。

相关内容