저는 쉘을 처음 접했고 구문 오류가 발생했지만 여전히 혼란스럽습니다.
#!/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
같은 복합 명령 이전에는 허용되지 않기 때문에 두 경우 모두 작동하지 않습니다.(( ))