"상수 배열"을 만드는 편리한 방법을 찾고 있습니다.

"상수 배열"을 만드는 편리한 방법을 찾고 있습니다.

zsh에서 배열을 만드는 편리한 방법이 있습니까?N같은 정수의 복사본이요?


문맥:tile_lengths쉘 스크립트에서는 약간 긴 두 개의 상수 블록으로 구성된 배열을 만들어야 합니다 . 장난감 버전은 다음과 같습니다

tile_lengths=(19 19 19 19 19 19 18 18 18 18 18 18 18 18 18)

...청크의 길이는 일반적으로 약 50이고 각 청크를 구성하는 정수 값과 청크의 길이는 런타임에만 알 수 있습니다.

답변1

저는 (완전히) zsh 초보자이므로 아마도 개선될 수 있을 것입니다.

tile_lengths=()
num=19
times=6
repeat $times { tile_lengths+=( $num ); ((--times)) }
num=18
times=9
repeat $times { tile_lengths+=( $num ); ((--times)) }
print $tile_lengths

19 19 19 19 19 19 18 18 18 18 18 18 18 18 18


에서 영감을 받다특별한답변, 저는 이것이 제가 처음 시도한 것보다 더 깔끔한 변형이라고 생각합니다.

tile_lengths=()
times=6 num=19 tile_lengths+=( $(repeat $times echo $num) )
times=9 num=18 tile_lengths+=( $(repeat $times echo $num) )
print $tile_lengths

19 19 19 19 19 19 18 18 18 18 18 18 18 18 18

답변2

확장 기능만 사용하여 이를 달성하는 방법은 다음과 같습니다 zsh.

tl=( ${${:-{1..6}}/*/19} ${${:-{1..9}}/*/18} )

zsh이는 배열을 사용하여 대체를 수행하는 방법을 활용합니다 . 1to로 채워진 배열을 만든 n다음 배열의 각 요소를 상수 값으로 대체합니다.

또한 런타임에 설정된 매개변수를 사용할 수도 있습니다.

ary=()
count=3
value=7
ary+=( ${${:-{1..$count}}/*/$value} )
count=5
value=21
ary+=( ${${:-{1..$count}}/*/$value} )

typeset -p ary
# => typeset -a ary=( 7 7 7 21 21 21 21 21 )

대체 확장( ) 외에 ${var/pat/val}중괄호 확장( {n..m}), 상수 확장( ${:-word})도 사용됩니다. 그것들은 모두 zshexpn매뉴얼 페이지에 문서화되어 있습니다.

답변3

어때요?

% tile_lengths=( $(repeat 25 echo 19; repeat 30 echo 18  ) )
% echo $tile_lengths                                        
19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18

다른 쉘의 경우 다음을 수행할 수 있습니다.

$ tile_lengths=( $(perl -le 'print "19 " x 25, "18 " x 30') )
$ print $tile_lengths
19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18

첫 번째는 $IFS개행 문자가 포함되어 있다고 가정하고, 두 번째는 $IFS공백 문자가 포함되어 있다고 가정하며 둘 다 $IFS포함되지 않는 것으로 가정 1하고 8둘 다 포함되지 않습니다 9. 기본값은 this 이어야 합니다 $IFS.

답변4

모든 쉘에 대한 리피터:

shuf -rn 5 -e 19

즉시값은 변수로 표현될 수 있습니다.

관련 정보