寻找一种方便的方法来创建“常量数组”

寻找一种方便的方法来创建“常量数组”

在zsh中,有没有一种方便的方法来创建数组n相同整数的副本?


语境:在 shell 脚本中,我需要创建一个数组 ,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

对于其他 shell,您可以执行以下操作:

$ 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。默认值应该是这种情况$IFS

答案4

适用于任何 shell 的中继器:

shuf -rn 5 -e 19

立即值可以用变量来表示。

相关内容