現代のプログラミングとスクリプト言語の私の経験によると、ほとんどのプログラマーは通常、配列の最初の要素をインデックス0(ゼロ)として参照することに慣れています。
配列インデックスを1から始めない他の言語について聞いたことがありますzsh
。それでも大丈夫です。なぜなら同様に便利だからです。しかし、以前にリリースされ、広く使用されているシェルスクリプト言語はすべてksh
ゼロbash
を使用しますが、なぜこの一般的な規則を変更したいのですか?
1を最初のインデックスとして使用することには実質的な利点がないようです。シェルのこのやや「排他的機能」について私が考えることができる唯一の説明は、「彼らは単にもっと素敵な外観を示すためにそうすることだけです」。殻"。
しかし、私はそれらのどれも彼らの歴史を知らずzsh
、それに関する私のマイナーな理論はおそらく理解できないでしょう。
これについての説明はありますか?それとも単なる個人的な好みの問題でしょうか?
答え1
- ほぼすべてのシェル配列(Bourne、csh、tcsh、fish、rc、es、yash)は1で始まります。 kshは私が知っている唯一の例外です(bashはkshをコピーします)。
- 当時(1990年代初頭)、ほとんどの解釈言語:少なくとも
awk
シェルtcl
で一般的に使用されているツール(cut -f1-3
、、、、、、)は1で始まりました。、、、1から始まる行番号付け...head -n 3
sort -k1,3
cal 1 2015
comm -1
sed
ed
vi
- zsh は Bourne シェルと csh を最大限に活用します。 Bourneシェル配列は1から始まります。 zshは(Bourneのように)または(cshのように)処理と一致します
$@
。たとえば、whereが最初の位置引数を提供しないことがどれほど混乱しているかを確認します。$@
$argv
ksh
${@:0:1}
- シェルはプログラミング言語の前にユーザーツールでした。ほとんどのユーザーにとって最初
$a[1]
これはまた、要素の数が最後のインデックスと同じであることを意味します(kshを除く他のほとんどのシェルと同様に、zshでも配列は次のようになります)。いいえ不足)。 a[1]
a[-1]
最初の要素は最後の要素と同じです。
だから私の考えでは、質問は次のようになります。David Kornが配列をゼロから開始することを選択したのはなぜですか?
あなたについて:
「しかし、以前にリリースされ、広く使用されているシェルスクリプト言語であるkshとbashは両方とも0を使用しているため」
bashはzshより数ヶ月早くリリースされましたが(1989年6月vs. 1990年12月)、各2.0バージョンに配列サポートが追加されましたが、zshは1991年にリリースされ、bashは1996年後半にリリースされました。
$1
配列を導入した最初のUnixシェル(1970年代のThompsonシェルとその位置パラメータについて考えたくない場合$2
)は、1970年代後半のcshであり、インデックス付けは1から始まりました。このコードは無料で利用できますが、kshは排他的で、1980年代後半までUnicesにデフォルトで含まれていました(そして高価格で別々に販売されました)。 ksh93コードは2000年頃にオープンソースとしてリリースされましたが、ksh88のコードは現在までオープンソースになったことはありません(考古学に興味があれば、今日のarchive.orgでksh86aとksh88dのソースコードを見つけるのは難しくありません)。
答え2
最も合理的な答えは、組み込みの逆方向配列だと思います。zsh
myvar=(1 2 3 4)
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つに到達できないため、説明できるはずです-0
。
2番目の理由は、zshの変数に関連するCコードが配列インデックスを使用または定義するint
ためdouble int
です。ボア負の数を表現するには、次のように表現することはできません-0
(シグネチャーゼロ)、浮動小数点変数を使用して実行できる操作と同じです。
0ベースのインデックス作成に精通している場合は、このKSH_ARRAYS
オプションを使用してこの問題を解決することをお勧めします。
そして、@cuonglmさんのコメントをHookとして活用してcsh
実装する機能について説明します。zsh
ここ。これは、歴史的な理由ではなく、仕事に慣れた人々に快適な勤務環境を提供するための方法のようです。csh