Busyboxでは、デフォルトのシェルはashであるため、bashでおなじみのトリックのいくつかは利用できません。私がやりたいことの1つは、{a..z}
のような文字のリストを展開することです。これは、bashでは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
に展開されます。この灰を行う別の方法はありますか?
POSIXly(およびbusyboxを使用)およびASCIIベースのシステム(EBCDICシステムでbusyboxが見つかったことはないと思います):
letters() { awk 'BEGIN{for(i=97;i<123;i++)printf "%c\n", i}'; }
$IFS
を変更していないと仮定すると、1行に1つずつ、その文字のリストに展開されます。
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
ベースのシェルを使用するようにビルド時に構成できることに注意してください。ただし、これはcshスタイルの{a,b}
のみであり、zshスタイルの{1..10}
、{a..z}
、またはksh93/zsh/bashにあるより高度な形式ではありません。
ash
シェルは中括弧の拡張をサポートしていません。
Perlを使用すると、次のことができます。
_Perl -e 'print join("\n",a..z), "\n"'
_
ここで、最初の_\n
_(join()
内)は、選択した区切り文字に置き換えることができます。
jot
ユーティリティを利用できる場合は、
_jot -c - a z
_