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
ように、そのリストを別の引数として渡すことです。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
使用するように構築時に設定することもできます。しかし、これはzshスタイルやksh93 / zsh / bashの高度な形式ではなく、hush
単にcshスタイルです。{a,b}
{1..10}
{a..z}
答え2
シェルは中ash
括弧拡張をサポートしていません。
Perlを使用すると、次のことができます。
perl -e 'print join("\n",a..z), "\n"'
最初の項目\n
(join()
)は必要な区切り文字に置き換えることができます。
jot
利用可能なユーティリティがある場合
jot -c - a z
答え3
Busyboxのインストールにhush
シェルが含まれている場合はそれを使用できます。支柱の拡張をサポートします。