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
これは、配列を使用して置換を実行する方法を利用します。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
他のシェルの場合は、次のことができます。
$ 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でなければなりません。1
8
9
$IFS
答え4
すべてのシェルのリピーター:
shuf -rn 5 -e 19
即値は変数で表すことができます。