재로 문자/숫자 목록을 확장하는 방법은 무엇입니까?

재로 문자/숫자 목록을 확장하는 방법은 무엇입니까?

busybox에서 기본 쉘은 ash이므로 bash의 일부 친숙한 트릭을 사용할 수 없습니다. 내가 하고 싶은 것 중 하나는 문자 목록을 확장하는 것입니다. 예를 들어 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}'; }

해당 문자 목록은 한 줄에 하나씩 확장되므로 수정하지 않았다고 가정합니다 $IFS.

cmd $(letters)

하나는 // 에서 했던 cmd것처럼 해당 목록을 별도의 인수로 전달하는 것입니다 .ksh93zshbashcmd {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)

seqPOSIX 명령은 아니지만 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셸이 포함되어 있으면 이를 사용할 수 있습니다. 버팀대 확장을 지원합니다.

관련 정보