If 语句语法错误 (BASH)

If statement syntax error (BASH)

我正在尝试使用下面的脚本获取服务器上某些站点的磁盘使用情况,但每当我尝试 运行 时都会收到此错误:

args.sh: line 50: syntax error near unexpected token `fi'
args.sh: line 50: `fi'

我看不到任何语法错误,但显然我做错了什么。谁能告诉我这是怎么回事?

这是我的代码:

#!/bin/bash

prefix="/var/www/html/"
suffix=".example.com"
path="$prefix$suffix"
args_length="$#"
paths_array=[]
args_array=("$@")

# If there is one argument, calculate disk usage of given site.
if [ args_length -eq 1];
    then echo "Calculating disk usage..."
    output=$(du -sh $path)
    echo "This site is currently using $output"
    exit 1

# If there are no arguments, calculate disk usage of all sites.
elif [ args_length -lt 1];
    then echo "Calculating disk usage for all sites..."
    # I haven't done this part yet!
    exit 1

# If there is more than one site, calculate their disk usage    
elif [ args_length > 1];
    then echo "Calculating disk usage for selected sites..."    
    #Save arguments to sites_array
    for x in args_array; do
        paths_array[x] = args_array[x]
    done
    #Loop through array, creating paths.
    for i in paths_array; do
        site = paths_array[i]
        paths_array[i] = "$prefix$site$suffix"
    done
    #Print out disk usage for each path in array.
    for y in paths_array; do
        output = $(du -sh $paths_array[y]) 
        echo "This site is currently using $output"
fi

旁注:对于我还没有写的部分,谁能告诉我应该如何将当前工作目录中所有文件夹的名称保存到一个数组中?我听说解析 'ls' 的输出是个坏主意,所以我正在寻找替代方法,如果有人有的话。

您所遇到的确实很接近 - 您只是在这里遇到了一些不同的小语法错误。

语法错误:

  1. 你没有用 done 关闭最后一个 for 循环 - 因此 fi 上的语法错误:解释器认为它仍在循环中。
  2. 您在 if 语句中删除了变量名称开头的 $(例如 args_length$args_length。结果,bash 将其解释为字符串 - args 长度 - 而不是 args_length 变量的值。
  3. 您在 = 周围放置了空格。在bash中,给变量赋值时,=两边不能有空格。相反,它应该总是像:name="value".
  4. 您在 if 语句中的右括号 (]) 之前缺少空格。

此代码有效:

#!/bin/bash

prefix="/var/www/html/"
suffix=".example.com"
path="$prefix$suffix"
args_length="$#"
paths_array=[]
args_array=("$@")

# If there is one argument, calculate disk usage of given site.
if [ $args_length -eq 1 ];
    then echo "Calculating disk usage..."
    output=$(du -sh $path)
    echo "This site is currently using $output"
    exit 1

# If there are no arguments, calculate disk usage of all sites.
elif [ $args_length -lt 1 ];
    then echo "Calculating disk usage for all sites..."
    # I haven't done this part yet!
    exit 1

# If there is more than one site, calculate their disk usage    
elif [ $args_length -gt 1 ];
    then echo "Calculating disk usage for selected sites..."    
    #Save arguments to sites_array
    for x in args_array; do
        paths_array[x]=$args_array[x]
    done
    #Loop through array, creating paths.
    for i in paths_array; do
        site=$paths_array[i]
        $paths_array[i]="$prefix$site$suffix"
    done
    #Print out disk usage for each path in array.
    for y in paths_array; do
        output=$(du -sh $paths_array[y]) 
        echo "This site is currently using $output"
    done
fi

输出:

Calculating disk usage for all sites...

bash 中的这些类型的错误非常常见并且很难确定,所以当它们发生时只需一步一个脚印,重新阅读您的代码,并尝试理解您的错误得到。