while 루프 오류

while 루프 오류

나는 유닉스 쉘 스크립트를 사용하여 정수 배열을 정렬하는 프로그램을 작성했습니다. 하지만 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

코드에 두 가지 오류가 있습니다.

  1. 테스트 에 사용되는 경우 [ ... ]여러 테스트를 분리하고 [ ... ]그 사이에 논리 연산자를 사용하십시오.

    while [ expression ] && [ expression ]; do
    

    bash이를 사용하는 경우 다음을 사용하여 테스트를 빌드할 수 있습니다 [[ ... ]].

    while [[ expression && expression ]]; do
    

    ...하지만 분할하면 더 읽기 쉬울 수 있습니다.

    while [[ expression ]] && [[ expression ]]; do
    

    적어도 더 길거나 더 많은 표현이 필요합니다. 산술 전용 테스트의 경우 (( ... ))in bash및 이를 지원하는 다른 쉘을 사용할 수 있습니다. 예를 들어 (( arithmetic expression )) && (( arithmetic expression ))In에서는 etc 대신 etc를 (( ... ))사용해야 합니다 .<>-lt-gt

  2. 배열을 사용한다고 가정하면 bash배열의 인덱스는 산술 컨텍스트에서 계산됩니다. 이는 ${a[$d]}다음과 같이 작성할 수 있음을 의미합니다 ${a[d]}. 더 중요한 것은 ${a[$(d-1)]}이 명령이 이라는 명령을 실행하려고 시도하기 때문에 버그일 수 있다는 것입니다 d-1. 아마도 그렇게 되어야 할 것입니다 ${a[d - 1]}.

관련 정보