web-dev-qa-db-ja.com

ashの文字/数字のリストを展開するにはどうすればよいですか?

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に展開されます。この灰を行う別の方法はありますか?

1
Paul

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/bashcmd {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にあるより高度な形式ではありません。

2

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

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

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

ここで、最初の_\n_(join()内)は、選択した区切り文字に置き換えることができます。

jotユーティリティを利用できる場合は、

_jot -c - a z
_
2
Kusalananda