구문 오류: 계산 사용 시 예상치 못한 '('('fi'가 필요함)

구문 오류: 계산 사용 시 예상치 못한 '('('fi'가 필요함)

저는 쉘을 처음 접했고 구문 오류가 발생했지만 여전히 혼란스럽습니다.

#!/bin/dash

ls="ls -l test"
small=0
medium=0
large=0

for i in $(seq 11 9 56)
do
    filename=$(echo $($ls) | cut -d ' ' -f $i)
    count=$(wc -w test/$filename | cut -d ' ' -f 1)
    if [ "$count" -lt 10 ]; then
        small=(( $small+1 ))
    elif [ "$count" -gt 100 ]; then
        large=(( $large+1 ))
    else
        medium=(( $medium+1 ))
    fi
done
echo $small
echo $medium
echo $large

이 코드에서는 파일 목록을 가져와 파일에 포함된 단어 수를 검색하고 이를 소/중/대 크기 파일로 분류하려고 합니다. 증가하는 변수를 사용하면 구문 오류가 발생하지 않을 것이라고 확신 test하지만 if 문에서는 작동하지 않는 것 같습니다. 누구든지 이 문제를 해결하도록 도와줄 수 있나요? if 문에서 여러 대괄호를 사용할 때 구문 오류가 발생하는데, 그 오류가 무엇인지 모르겠습니다.

답변1

구문은 다음과 같습니다.

large=$(( $large + 1 ))

또는 더 나은 방법은 다음과 같습니다.

large=$(( large + 1 ))

아니요 large=(( $large+1 )).

Korn과 같은 쉘에는 (( large = large + 1 ))또는 이 (( large += 1 ))있지만 (( large++ ))POSIX조차도 ksh가 다음과 같다고 지정합니다.$((...)) 산술 확장연산자 sh, 그들은 생략합니다((...)) 산술 표현연산자이므로 dash구현하는 데 신경 쓰지 않았습니다.

어쨌든 스크립트의 나머지 부분은 별로 의미가 없습니다. 의미하는 바는 다음과 같습니다.

#! /bin/sh -

small=0 medium=0 large=0
for file in test/*; do
  words=$(wc -w < "$file") || continue
  if [ "$words" -lt 10 ]; then    # 0 to 9
    small=$(( small + 1 ))
  elif [ "$words" -gt 100 ]; then # 101 and above
    large=$(( large + 1 ))
  else                            # 10 to 100
    medium=$(( medium + 1))
  fi
done

printf '%s\n' "$small" "$medium" "$large"

다음을 수행할 수도 있습니다.

...
  if [ "$words" -lt 10 ]; then    # 0 to 9
    kind=small
  elif [ "$words" -gt 100 ]; then # 101 and above
    kind=large
  else                            # 10 to 100
    kind=medium
  fi
  : "$(( $kind += 1 ))"
...

여기서 산술 확장은 이름이 저장된 변수의 값을 증가시키는 부작용이 $kind있으며 해당 확장의 결과를 명령에 null을 전달하여 삭제하므로 :실제로는 ksh 스타일과 유사합니다 (( $kind += 1 )).

답변2

대신 너 var=$(( expr ))한테 필요해var=(( expr ))

(단어를 구분하는 데 사용되는 제어 연산자입니다 dash. 그러니 var=(...그렇게 되어도 아무 소용이 없어요var= (...

(((예를 들어) 알려져 있지만 bash알려지지 않았 dash으므로 이것이 작동하지 않는 것은 놀라운 일이 아닙니다.

bash변수 할당은 간단한 명령 내에서만 허용되고 와 bash같은 복합 명령 이전에는 허용되지 않기 때문에 두 경우 모두 작동하지 않습니다.(( ))

관련 정보