現代のプログラミングとスクリプト言語の私の経験によると、ほとんどのプログラマーは通常、配列の最初の要素をインデックス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のソースコードを見つけるのは難しくありません)。