쉘 스크립트를 실행하려고 하는데 If: 표현식 구문이 계속 표시됩니다. 어떻게 없애나요?

쉘 스크립트를 실행하려고 하는데 If: 표현식 구문이 계속 표시됩니다. 어떻게 없애나요?

안녕하세요. 작업 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"가 무엇인지 모릅니다), 무슨 일이 일어나는지 알려주어야 합니다. 구문 오류가 있다고 말하지 말고 스크립트를 실행하는 방법을 정확하게 보여주고정밀한에러 메시지.

즉, 귀하의 질문은 간단합니다.

  1. 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
    
  2. 이는 [명령이므로 모든 명령과 마찬가지로 단일 토큰임을 나타내기 위해 앞뒤에 공백이 필요합니다. 이는 if [-r "$item" ]구문 오류이므로 필요함을 의미합니다 if [ -r "$item" ].

  3. if블록은 에 의해 닫혔습니다 fi. 그러나 elifelse은 동일한 블록의 일부이므로 개구부를 닫으면 추가할 수 없거나 if나중에 새 블록을 먼저 열어야 합니다 .elifelseif

이 모든 것을 종합하면 다음은 정확히 동일한 논리를 유지하고 구문 오류만 수정하는 작업 버전의 스크립트입니다.

#!/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"

관련 정보