現代のプログラミング言語とスクリプト言語での私の経験から、ほとんどのプログラマーは一般に配列の最初の要素をでインデックスとして参照することに慣れていると思います。
1を使用することに実質的な利点はありますか?
配列で同様に動作するZsh以外の言語を聞いたことがあると思います。それも同じくらい便利なので、私はそれで結構です。
しかし、以前にリリースされ、広く使用されているkshやbashなどのシェルスクリプト言語はすべて0を使用するため、-why誰かがこの一般的な「標準」を変更することを選択しますか?
私の質問に対する私の直接の答えは「もちろん」ではないでしょう。
そして、シェルに対するこのやや「独占的な機能」に関して私が考えることができる唯一の説明は、「彼らのクールなシェルをもう少し自慢するためにこれをやっただけです "。
Zshもその歴史もあまり知らないので、このことについてのささいな理論が意味をなさない可能性が高いです。
これには説明がありますか?それとも個人的な趣味だけではありませんか?
awk
、tcl
、およびシェルから通常使用されるツール(cut -f1-3
、head -n 3
、sort -k1,3
、cal 1 2015
、comm -1
)1から開始します。sed
、ed
、vi
は、1行目から数えます...$@
は1から始まります。zshは、$@
(Bourneのように)または$argv
(cshのように)の処理と一貫しています。これがksh
でどれほど混乱しているのかを確認してください。ここで、${@:0:1}
は、たとえば最初の位置パラメータを提供しません。$a[1]
にfirst要素を含めることは理にかなっています。また、要素の数が最後のインデックスと同じであることを意味します(kshを除く他のほとんどのシェルと同様にzshでは、配列はnot sparseです)。a[1]
は、最後の要素のa[-1]
と一致しています。したがって、IMOの質問はむしろ次のようになります:配列を0から開始するためにDavid Kornの頭に入ったもの
これに対する最ももっともらしい答えは、zsh
から組み込まれた逆配列であると思います
4つの要素を持つ配列がある場合、myvar=(1 2 3 4)
と言って、4番目の要素にアクセスする場合は、print $myvar[4]
になりますよね?
ただし、この配列内の要素を逆方向にリストするループを作成する場合は、負のインデックスを使用するだけです。
print $myvar[-1] # will print 4
print $myvar[-2] # will print 3
print $myvar[-3] # will print 2
print $myvar[-4] # will print 1
ゼロから始めて、-0
がないため、これらの要素の1つに到達しないため、これは説明する必要があります。
これの背後にある2番目の理由は、おそらくzshの変数に関連するCコードがint
またはdouble int
を使用して配列インデックスを定義していること、そして Two's Complement 数値は、浮動小数点変数で行うことができるように、-0
( Signed zero )を表す方法はありません。
本当に0から始まるインデックスに慣れている場合は、KSH_ARRAYS
オプションを使用してこれを修正することをお勧めします。
そして@cuonglmコメントのフックを取って、csh
に実装されたzsh
機能について説明します here 。これは歴史的な理由ではないようですが、csh
を使用している人々に快適な作業環境を提供する方法です