Zsh 배열의 첫 번째 요소가 0 대신 1로 색인되는 이유가 있습니까?


27

현대 프로그래밍 및 스크립팅 언어에 대한 나의 경험을 통해 대부분의 프로그래머는 일반적으로 배열의 첫 번째 요소 를 인덱스 로 0 으로 참조하는 데 익숙하다고 생각 합니다. 1
을 사용할 때 실질적인 이점이 있습니까?

Zsh 이외의 다른 언어가 배열과 비슷하게 작동한다고 들었습니다. 그것은 똑같이 편리하기 때문에 괜찮습니다.
그러나 ksh 및 bash와 같이 이전에 출시되어 널리 사용 된 쉘 스크립팅 언어가 모두 0을 사용하는 이유 는 무엇입니까?

나의 질문에 대한 나의 즉각적인 대답은 "물론 아니다";
그런 다음,이 "독점적 인 기능"에 대해 쉘에 대해 생각할 수있는 유일한 설명은 " 그들은 단지 조금 더 멋진 쉘을 보여주기 위해이 작업을 수행 한 것 "입니다.

나는 Zsh 나 그 역사에 대해 잘 모른다. 이것에 관한 나의 사소한 이론이 이해가되지 않을 가능성이 높다.

이에 대한 설명이 있습니까? 아니면 개인 취향이 맞지 않습니까?


5
일부 역사 연구 (또는 rantish 숙고?) 0 1 대의 주제에 : exple.tive.org/blarg/2013/10/22/citation-needed
thrig

역사적 이유로, 아마도 csh1 기반 배열 인덱싱을 사용했던 것입니다.
cuonglm

3
현재 sh는 가능한 다른 통역사가있는 표준 언어 (구현 아님)입니다. bash, ksh 및 yash와 같은 sh 언어에 대한 일부 해석기는 확장으로 배열을 지원하지만 표준 C 언어의 컴파일러는 표준 C 언어에 대한 확장을 지원하는 gcc와 같은 언어의 일부가 아닙니다. C와 마찬가지로 "sh"인터프리터의 "공식"구현은 없습니다.
Stéphane Chazelas


4
어쩌면 약간의 주제이지만 관련성이 있습니다. 로마인은 0이 아닌 1부터 시작하여 포괄적 계산을 사용했습니다. 내일 다음날 우리에게 "2 일 전"은 "3 일 전"이었습니다. 그들은 오늘 0이 아닌 1로 계산했습니다. 그 결과 이집트 천문학 자들이 4 년마다 도약을 추천했을 때, 로마인들은 기원전 45 년부터 3 년마다 그것을 소개했습니다. 오류가 수정 되려면 기원전 12 년까지 소요되었습니다.
Harry Weston

답변:


32
  • 사실상 모든 쉘 배열 (Bourne, csh, tcsh, fish, rc, es, yash)은 1부터 시작합니다. ksh는 내가 아는 유일한 예외입니다 (bash는 ksh를 복사했습니다).
  • 대부분의 해석시의 언어 (90 년대 초) awk, tcl적어도 및 도구는 일반적으로 쉘에서 사용 ( cut -f1-3, head -n 3, sort -k1,3, cal 1 2015, comm -1) 1. 시작 sed, ed, vi1에서 숫자들이 선 ...
  • zsh는 Bourne 쉘과 csh를 최대한 활용합니다. Bourne 쉘 배열 $@은 1부터 시작합니다. zsh는 $@(Bourne에서와 같이) 또는 $argv(csh에서와 같이 ) 처리와 일치 합니다. 예를 들어 첫 번째 위치 매개 변수를 제공하지 않는 ksh위치 에서 어떻게 혼동되는지 확인하십시오 ${@:0:1}.
  • 쉘은 프로그래밍 언어가되기 전에 사용자 도구입니다. 대부분의 사용자에게는에 첫 번째 요소가있는 것이 $a[1]좋습니다. 또한 요소의 수가 마지막 지표와 동일 함을 의미합니다 (ksh를 제외한 대부분의 다른 쉘에서와 같이 zsh에서는 배열이 성 가시지 않습니다 ).
  • a[1]첫 번째 요소는 a[-1]마지막 요소와 일치 합니다.

따라서 IMO의 문제는 오히려 배열이 0에서 시작하도록 David Korn의 머리에 무엇이 들어갔습니까?


7
그것은이다 버그 번호가 1부터 것이 인간의 언어로, 대부분의 프로그래밍 언어 설계에서 그 유산을 유지 관리하는 것이 놀라운 우연. 모든, 그 슬퍼 제로 인덱스가 사실상 표준으로 설립되었으며, 많은 "사용자 중심"언어는 사용하여 "간단"으로 노력하고, 거꾸로있어 잘못을 다시 색인을 하나의 기반. — 즉, 색인 혼동을 피하는 가장 좋은 방법은 물론 숫자 인덱스를 완전히 피하는 것입니다.
leftaroundabout

여기에서 읽기 : 첨자 1로 시작하는 경우에 "길이 N의 시퀀스를 다룰 때, 요소가있는 우리가 첨자로 구별하고자 ... a) 수율은 첨자 범위는 1 ≤ 난 <N + 1]로 시작 그러나 0은 더 좋은 범위 0 ≤ i <N을 나타 냅니다. TROLL 또는 STUPID인지는 모르지만 배열에서 1로 시작하는 아래 첨자에는 "1 ≤ i ≤ N"을 사용할 수 있습니다. 어레이 스캔의 끝에 +1을 넣을 필요가 없으며 1 또는 0으로 시작하는 인덱스가 더 좋다는 관점은 없습니다.

1
당신은 인간의 지식에 0이 추가되었다는 것을 정당화 할 수 있으며, 그 때 어떻게 든 엉망이되었습니다. theguardian.com/notesandqueries/query/0,5753,-1358,00.html- 다시 한 번, 관점의 문제 :)

3
Bourne 쉘 배열 $ @은 0이 아닌 1에서 시작합니다. $ 0은 실행중인 프로그램의 이름입니다. 세 번째 요점을 수정해야합니다
Edward Torvalds

2
@edwardtorvalds, No $0는 위치 매개 변수가 아닙니다. 의 일부가 아닙니다 $@. "$@"입니다 "$1" "$2" .... 많은 쉘에서 함수에 관해서는 함수 "$@"에 대한 인수 인 것을 $0알면서 스크립트 경로 를 유지합니다 (또는 스크립트를 실행하지 않을 때 쉘 argv [0])
Stéphane Chazelas

7

이것에 대한 가장 그럴듯한 대답은 내장 된 역 배열입니다 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부터 시작하여 설명해야하지만, 요소가 없으므로 해당 요소 중 하나에 도달하지 못합니다 -0.

두 번째 이유는 아마도 zsh의 변수와 관련된 C 코드가 배열 인덱스를 사용 int하거나 double int정의하고 있기 때문에 아마도 2의 보수 를 사용 하여 음수를 나타 내기 때문에 float에서 할 수있는 것처럼 -0( Signed zero ) 를 나타낼 방법이 없습니다 점 변수.

0에서 시작하는 색인에 실제로 익숙하다면이 KSH_ARRAYS옵션을 사용하여 이를 수정 하는 것이 좋습니다 .

그리고 @cuonglm 주석의 후크를 받아 csh구현 된 기능 zsh여기 에 설명되어 있습니다 . 역사적인 이유는 아니지만 함께 사용하는 사람들에게 편안한 작업 환경을 제공하는 방법 인 것 같습니다.csh


3
그러면 첫 번째 배열 항목과 마지막 배열 항목에 동시에 액세스하여 배열을 스캔하는 모든 논리를 깨뜨려야합니다.) 블랙홀을 만들 수도 있습니다. LOL

3
0 - 인덱스 배열은 교체 -와 함께 ~.
mikeserv

1
@mfxx-나는 얘기했다 bash. 나는 그것이 집합 설탕에 대한 음수 인덱스를 구문 설탕으로 처리한다고 생각 하지만 그렇지 않으면 그렇지 않습니다. 기억이 안나 내 관점에서 사람들은 디렉토리를 만들고 모든 셸 상태에 관계없이 파일을 사용해야합니다. 원하는 방식으로 해당 요소를 색인 할 수 있습니다.
mikeserv

1
~이진 반전입니다. ~0입니다 -1. (모든 비트가 뒤집 히면 음수가 숫자로 표현되는 방식에 의존합니다). indice 0, a [0], a [-0], a [-1] 및 a [~ 0]의 요소가 하나만있는 배열 또는 설정되지 않은 배열에서 ksh와 같은 배열에서 동일한 것을 제공합니다.
Stéphane Chazelas

1
@ StéphaneChazelas-예, 작동하지 않을 ~때 이것을 처리하는 것을 기억 -index합니다. 아마 내가 한 모든 것 같아요 ~-index. 네. 그 소리가납니다. 예! 물론 설정되지 않은 요소에도 적용됩니다. 따라서 위의 주석은 0 색인 배열에 추가 해야한다고 생각합니다 ~. 나는 그것이 아마도 -1 부분을 더 쉽게 처리했다고 생각합니다. 난 몰라 그것은 지금 내 기억의 최전선으로 점프하지 않습니다 ...
mikeserv
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.