シェルスクリプトを実行しようとしていますが、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ステートメントには特定の構文が必要です。if condition; then action; fi;「リスト終結者」if commandと を区別するには、リストの終端が必要ですthen actionfor必須ループにも同じです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。ただし、elifおよびelseは同じブロックの一部であるため、開口部を閉じると追加できないか、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"

おすすめ記事