Busybox
如何擴展 ash 中的字母/數字列表?
在busybox中,預設的shell是ash,所以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
bash。有沒有另一種方法來做這個灰?
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 中找到的更高級的形式。