「定数配列」を作成する便利な方法を探しています。

「定数配列」を作成する便利な方法を探しています。

zshで配列を作成する便利な方法はありますか?N同じ整数のコピーですか?


コンテキスト:tile_lengthsシェルスクリプトでは、わずかに長い2つの定数ブロックで構成される配列を作成する必要があります。おもちゃのバージョンは次のとおりです

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

1つ目は$IFS改行文字が含まれていると仮定し、2つ目は空白$IFS文字が含まれていると仮定し、両方が$IFS含まれていないと仮定し、両方が含まれていません。デフォルト値はthisでなければなりません。189$IFS

答え4

すべてのシェルのリピーター:

shuf -rn 5 -e 19

即値は変数で表すことができます。

関連情報