현대 프로그래밍 및 스크립팅 언어에 대한 나의 경험에 따르면 대부분의 프로그래머는 일반적으로 배열의 첫 번째 요소를 인덱스 0(영)으로 참조하는 데 익숙합니다.
배열 인덱싱을 1에서 시작하지 않는 다른 언어 에 대해 들어본 적이 있을 것입니다 zsh
. 그래도 괜찮습니다. 왜냐하면 마찬가지로 편리하기 때문입니다. 그러나 이전에 출시되어 널리 사용되는 쉘 스크립트 언어는 ksh
모두 bash
0을 사용하는데 왜 이 일반 규칙을 변경하려고 할까요?
1을 첫 번째 인덱스로 사용하는 것에는 실질적인 이점이 없는 것 같습니다. 쉘의 이 다소 "독점적 기능"에 대해 제가 생각할 수 있는 유일한 설명은 "그들은 단지 더 멋진 모습을 보여주기 위해 그렇게 하는 것뿐입니다." 껍데기".
하지만 나는 그들 중 어느 것이나 그들의 역사에 대해 잘 알지 못하며 zsh
, 그것에 관한 나의 사소한 이론은 아마도 이해가 되지 않을 것입니다.
이에 대한 설명이 있나요? 아니면 단지 개인적인 취향의 문제일까요?
답변1
- 거의 모든 쉘 배열(Bourne, csh, tcsh, fish, rc, es, yash)은 1로 시작합니다. ksh는 내가 아는 유일한 예외입니다(bash는 ksh를 복사합니다).
- 그 당시(1990년대 초반) 대부분의 해석 언어:
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에서와 같이) 또는 (csh에서와 같이) 처리와 일치합니다
$@
. 예를 들어 where가 첫 번째 위치 인수를 제공하지 않는 것이 얼마나 혼란스러운지 확인하세요.$@
$argv
ksh
${@:0:1}
- 쉘은 프로그래밍 언어 이전에 사용자 도구였습니다. 대부분의 사용자에게는첫 번째
$a[1]
이는 또한 요소 수가 마지막 인덱스와 동일함을 의미합니다(ksh를 제외한 대부분의 다른 쉘에서와 마찬가지로 zsh에서도 배열은 다음과 같습니다) .아니요부족한). a[1]
a[-1]
첫 번째 요소는 마지막 요소와 동일합니다.
그래서 제 생각에는 질문은 다음과 같아야 합니다.David Korn이 배열을 0에서 시작하도록 선택한 이유는 무엇입니까?
당신에 대해:
"그러나 이전에 출시되어 널리 사용되는 쉘 스크립트 언어인 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부터 시작하면 이러한 요소 중 하나에 도달할 수 없기 때문에 설명할 수 있어야 합니다 -0
.
두 번째 이유는 zsh의 변수와 관련된 C 코드가 배열 인덱스를 사용 int
하거나 double int
정의하기 때문일 수 있습니다.보어음수를 표현하려면 다음과 같이 표현할 수 없습니다 -0
(시그니처 제로), 부동 소수점 변수를 사용하여 수행할 수 있는 작업과 같습니다.
0 기반 인덱싱에 익숙하다면 이 KSH_ARRAYS
옵션을 사용하여 이 문제를 해결하는 것이 좋습니다.
그리고 @cuonglm 님의 코멘트를 Hook으로 활용하여 csh
구현하는 기능을 설명합니다.zsh
여기. 이는 역사적인 이유라기 보다는 일에 익숙해진 사람들에게 편안한 근무환경을 제공하기 위한 방법인 것 같습니다.csh