下午好,我正在尝试运行作业 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;
或换行符作为列表终止符,但您需要有一个列表终止符。其中任何一个都可以: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"