我正在尝试运行 shell 脚本,但我不断收到 If: 表达式语法。我该如何摆脱它

我正在尝试运行 shell 脚本,但我不断收到 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 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
    
  2. [是一个命令,因此与所有命令一样,它前后都需要一个空格,以表明它是单个标记。这意味着这if [-r "$item" ]是一个语法错误,您需要if [ -r "$item" ].

  3. if块由 关闭fi。但是,elifelse是同一块的一部分,因此如果您关闭开口if,则无法在之后添加elifelse,您需要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"

相关内容