灰で文字/数字のリストを拡張するには?

灰で文字/数字のリストを拡張するには?

busyboxでは、デフォルトのシェルはashなので、bashのいくつかのおなじみのトリックは利用できません。私がやりたいことの1つは、文字リストを拡張することです。たとえば、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ベースのシステム(BusyboxはEBCDICシステムで見つかったことがないようです):

letters() { awk 'BEGIN{for(i=97;i<123;i++)printf "%c\n", i}'; }

その文字のリストは1行に1つずつ展開されるため、変更しなかったと仮定します$IFS

cmd $(letters)

1つは//で行ったcmdように、そのリストを別の引数として渡すことです。ksh93zshbashcmd {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

seqPOSIXコマンドではありませんが、busybox確かに付属しています。

busyboxはデフォルトでsh構築されていますが、中かっこ拡張をサポートするベースシェルをash使用するように構築時に設定することもできます。しかし、これはzshスタイルやksh93 / zsh / bashの高度な形式ではなく、hush単にcshスタイルです。{a,b}{1..10}{a..z}

答え2

シェルは中ash括弧拡張をサポートしていません。

Perlを使用すると、次のことができます。

perl -e 'print join("\n",a..z), "\n"'

最初の項目\njoin())は必要な区切り文字に置き換えることができます。

jot利用可能なユーティリティがある場合

jot -c - a z

答え3

Busyboxのインストールにhushシェルが含まれている場合はそれを使用できます。支柱の拡張をサポートします。

関連情報