안녕하세요. 작업 4에 대한 코드를 실행하려고 하는데 표현식 구문 오류가 계속 발생합니다. 이유를 알려주실 수 있나요?
#!/bin/sh
if [ "$#" -ne 1 ] then
echo "Usage: assignment4.sh <directory_name>"
exit 1
fi
if [ ! -d "$1" ] then
echo "$1: No such directory"
exit 1
fi
num_dir=0
num_file=0
num_readable=0
num_writable=0
num_executable=0
for item in "$1"/* do
#Question1
if [-d "$item" ] then
num_dir=$((num_dir+1))
fi
#Question 2
elif [ -f "$item" ] then
num_file=$((num_file+1))
fi
#Question 3
if [-r "$item" ] then
num_readable=$((num_readable+1))
fi
#Question 4
if [ -w "$item" ] then
num_writable=$((num_writable+1))
fi
#Question 5
if [ -x "$item" ] then
num_executable=$((num_executable+1))
fi
done
echo "Number of directories: $num_dir"
echo "Number of files: $num_file"
echo "Number of readable items: $num_readable"
echo "Number of writable items: $num_writable"
echo "Number of executable items: $num_executable"
답변1
이와 같은 질문을 할 때 코드가 무엇을 해야 하는지(우리는 "과제 4"가 무엇인지 모릅니다), 무슨 일이 일어나는지 알려주어야 합니다. 구문 오류가 있다고 말하지 말고 스크립트를 실행하는 방법을 정확하게 보여주고정밀한에러 메시지.
즉, 귀하의 질문은 간단합니다.
if
문에는 특정 구문이 필요합니다: .isif condition; then action; fi
;
"목록 종결자"if command
그리고 와 를 구분하려면 목록 종결자가 필요합니다then action
.for
필수 루프 에도 마찬가지입니다for thing in list_of_things; do action; done
. 두 경우 모두 목록 종결자로 a 또는 newline을 사용할 수 있지만;
목록 종결자가 있어야 합니다. 다음 중 하나가 수행됩니다.if [ "$#" -ne 1 ]; then command fi for item in "$1"/*; do command done
또는
if [ "$#" -ne 1 ] then command fi for item in "$1"/* do command done
이는
[
명령이므로 모든 명령과 마찬가지로 단일 토큰임을 나타내기 위해 앞뒤에 공백이 필요합니다. 이는if [-r "$item" ]
구문 오류이므로 필요함을 의미합니다if [ -r "$item" ]
.if
블록은 에 의해 닫혔습니다fi
. 그러나elif
및else
은 동일한 블록의 일부이므로 개구부를 닫으면 추가할 수 없거나if
나중에 새 블록을 먼저 열어야 합니다 .elif
else
if
이 모든 것을 종합하면 다음은 정확히 동일한 논리를 유지하고 구문 오류만 수정하는 작업 버전의 스크립트입니다.
#!/bin/sh
if [ "$#" -ne 1 ]; then
echo "Usage: assignment4.sh <directory_name>"
exit 1
fi
if [ ! -d "$1" ]; then
echo "$1: No such directory"
exit 1
fi
num_dir=0
num_file=0
num_readable=0
num_writable=0
num_executable=0
for item in "$1"/*; do
#Question1
if [ -d "$item" ]; then
num_dir=$((num_dir+1))
#Question 2
elif [ -f "$item" ]; then
num_file=$((num_file+1))
fi
#Question 3
if [ -r "$item" ]; then
num_readable=$((num_readable+1))
fi
#Question 4
if [ -w "$item" ]; then
num_writable=$((num_writable+1))
fi
#Question 5
if [ -x "$item" ]; then
num_executable=$((num_executable+1))
fi
done
echo "Number of directories: $num_dir"
echo "Number of files: $num_file"
echo "Number of readable items: $num_readable"
echo "Number of writable items: $num_writable"
echo "Number of executable items: $num_executable"