在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
使用数组执行替换。它创建一个用1
to填充的数组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
立即值可以用变量来表示。