Busybox

如何擴展 ash 中的字母/數字列表?

  • March 19, 2022

在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 zbash。有沒有另一種方法來做這個灰?

POSIXly(和busybox)和基於ASCII的系統(我認為在EBCDIC系統上從來沒有發現busybox):

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

將擴展到該字母列表,每行一個,因此假設您沒有修改$IFS

cmd $(letters)

將是一種將該列表作為單獨參數傳遞給cmd. 就像你對ksh93//的那樣zshbash``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 中找到的更高級的形式。

引用自:https://unix.stackexchange.com/questions/429298