こんにちは。タスク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
ステートメントには特定の構文が必要です。if 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"