현대 프로그래밍 및 스크립팅 언어에 대한 나의 경험을 통해 대부분의 프로그래머는 일반적으로 배열의 첫 번째 요소 를 인덱스 로 0 으로 참조하는 데 익숙하다고 생각 합니다. 1
을 사용할 때 실질적인 이점이 있습니까?
Zsh 이외의 다른 언어가 배열과 비슷하게 작동한다고 들었습니다. 그것은 똑같이 편리하기 때문에 괜찮습니다.
그러나 ksh 및 bash와 같이 이전에 출시되어 널리 사용 된 쉘 스크립팅 언어가 모두 0을 사용하는 이유 는 무엇입니까?
나의 질문에 대한 나의 즉각적인 대답은 “물론 아니다”;
그런 다음,이 “독점적 인 기능”에 대해 쉘에 대해 생각할 수있는 유일한 설명은 ” 그들은 단지 조금 더 멋진 쉘을 보여주기 위해이 작업을 수행 한 것 “입니다.
나는 Zsh 나 그 역사에 대해 잘 모른다. 이것에 관한 나의 사소한 이론이 이해가되지 않을 가능성이 높다.
이에 대한 설명이 있습니까? 아니면 개인 취향이 맞지 않습니까?
답변
- 사실상 모든 쉘 배열 (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
,vi
1에서 숫자들이 선 … - zsh는 Bourne 쉘과 csh를 최대한 활용합니다. Bourne 쉘 배열
$@
은 1부터 시작합니다. zsh는$@
(Bourne에서와 같이) 또는$argv
(csh에서와 같이 ) 처리와 일치 합니다. 예를 들어 첫 번째 위치 매개 변수를 제공하지 않는ksh
위치 에서 어떻게 혼동되는지 확인하십시오${@:0:1}
. - 쉘은 프로그래밍 언어가되기 전에 사용자 도구입니다. 대부분의 사용자에게는에 첫 번째 요소가있는 것이
$a[1]
좋습니다. 또한 요소의 수가 마지막 지표와 동일 함을 의미합니다 (ksh를 제외한 대부분의 다른 쉘에서와 같이 zsh에서는 배열이 성 가시지 않습니다 ). 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부터 시작하여 설명해야하지만, 요소가 없으므로 해당 요소 중 하나에 도달하지 못합니다 -0
.
두 번째 이유는 아마도 zsh의 변수와 관련된 C 코드가 배열 인덱스를 사용 int
하거나 double int
정의하고 있기 때문에 아마도 2의 보수 를 사용 하여 음수를 나타 내기 때문에 float에서 할 수있는 것처럼 -0
( Signed zero ) 를 나타낼 방법이 없습니다 점 변수.
0에서 시작하는 색인에 실제로 익숙하다면이 KSH_ARRAYS
옵션을 사용하여 이를 수정 하는 것이 좋습니다 .
그리고 @cuonglm 주석의 후크를 받아 csh
구현 된 기능 zsh
은 여기 에 설명되어 있습니다 . 역사적인 이유는 아니지만 함께 사용하는 사람들에게 편안한 작업 환경을 제공하는 방법 인 것 같습니다.csh