나는 유닉스 쉘 스크립트를 사용하여 정수 배열을 정렬하는 프로그램을 작성했습니다. 하지만 11번째 줄에서 오류가 발생합니다.
while [ $d -gt 0 && ${a[$(d-1)]} -gt ${a[$d]} ]
오류는 insertionsort.sh: line 11: [: missing
]''와 같습니다. 내가 뭘 잘못했나요?
답변1
명령 을 분할해야 합니다 test
(또는 POSIX 호환 셸을 사용하는 경우 확장명을 인용해야 합니다).
[ "$d" -gt 0 ] && [ "${a[d-1]}" -gt "${a[d]}" ]
답변2
이는 ksh 구문( bash
및 에서도 지원됨)이고 이러한 배열의 인덱싱은 (다른 모든 쉘에서와 같이 1 대신) 0에서 시작하므로 여기에서 산술 평가 연산자를 사용할 zsh -o ksharrays
수도 있습니다 .ksh
((...))
while ((d > 0 && a[d-1] > a[d]))
(다른 사람들이 이미 귀하의 코드에서 문제를 설명했습니다.)
zsh에는 10진 정수 배열을 숫자로 정렬하는 기능이 내장되어 있습니다.
$ a=(10 6 2)
$ echo ${(n)a}
2 6 10
ksh는 배열을 정렬할 수 있지만 어휘순으로만 정렬할 수 있습니다.
$ a=(10 2 6)
$ set -sA b -- "${a[@]}"
$ echo "${b[@]}"
10 2 6
답변3
코드에 두 가지 오류가 있습니다.
테스트 에 사용되는 경우
[ ... ]
여러 테스트를 분리하고[ ... ]
그 사이에 논리 연산자를 사용하십시오.while [ expression ] && [ expression ]; do
bash
이를 사용하는 경우 다음을 사용하여 테스트를 빌드할 수 있습니다[[ ... ]]
.while [[ expression && expression ]]; do
...하지만 분할하면 더 읽기 쉬울 수 있습니다.
while [[ expression ]] && [[ expression ]]; do
적어도 더 길거나 더 많은 표현이 필요합니다. 산술 전용 테스트의 경우
(( ... ))
inbash
및 이를 지원하는 다른 쉘을 사용할 수 있습니다. 예를 들어(( arithmetic expression )) && (( arithmetic expression ))
In에서는 etc 대신 etc를(( ... ))
사용해야 합니다 .<
>
-lt
-gt
배열을 사용한다고 가정하면
bash
배열의 인덱스는 산술 컨텍스트에서 계산됩니다. 이는${a[$d]}
다음과 같이 작성할 수 있음을 의미합니다${a[d]}
. 더 중요한 것은${a[$(d-1)]}
이 명령이 이라는 명령을 실행하려고 시도하기 때문에 버그일 수 있다는 것입니다d-1
. 아마도 그렇게 되어야 할 것입니다${a[d - 1]}
.