语法错误:“那么”意外(期望“完成”)

时间:2019-01-27 10:59:44

标签: shell

这是我的问题陈述。

  

编写一个以文件夹名称作为命令行参数的shell脚本,并生成一个文件,其中包含大小为0的所有子文件夹(即空子文件夹)的名称

这是我的shell脚本。

ls $1
while read folder
do
        files = 'ls $folder | wc -l'
        if[$files -eq 0];
        then
                echo "$folder">>output.txt
                echo "File deleted"
        else
                echo "File is not empty"
        fi
done

当我执行命令(使用“ sh文件名”)时,它显示语法错误!

 Syntax error: "then" unexpected (expecting "done")

我的脚本有问题吗?

4 个答案:

答案 0 :(得分:1)

别忘了,shell [中的二进制文件带有参数并返回true或false(0或1)。
if是一个关键字,用于验证返回的下一个二进制数是否为true(0)。

所以,当你这样做

if[$files -eq 0]

您的外壳一无所知,因为它尝试启动if[2程序,而他在未检测到then之后找到了if
为了解决您的问题,您必须在if之后和[之后放置一个空格,因为二进制文件的名称和参数之间必须有一个空格。

ls $1
while read folder
do
        files = `ls $folder | wc -l`
        if [ $files -eq 0 ]
        then
                echo "$folder">>output.txt
                echo "File deleted"
        else
                echo "File is not empty"
        fi
done

答案 1 :(得分:0)

尝试这样的事情

ls $1
while read folder
do
        files=`ls $folder | wc -l`
        if [ $files -eq 0 ]; then
                echo "$folder">>output.txt
                echo "File deleted"
        else
                echo "File is not empty"
        fi
done

请注意,没有空格文件= ..,并且有((反引号)不是'(单引号)

注意'if'和'['...之间的空格...

答案 2 :(得分:0)

可能存在间距错误:

只需执行2个步骤:

  1. 运行app.add_api
  2. 运行hexdump -C yourscript.sh

它将创建新的正确文件,然后运行新文件。

答案 3 :(得分:0)

您已经获得了描述如何修复现有脚本的答案:

    设置=变量时,
  • $files周围没有空格
  • 用反引号代替命令的单勾号,
  • if之后的空格,以及条件表达式各部分之间的空格。

您的脚本遭受Parsing LS问题的困扰,因为文件名中包含换行符之类的特殊字符可能会受到不好的对待。当您只想检查文件是否存在(例如count == 0)时,虽然您可能认为这不是一个大问题,但是您的操作方式仍然很麻烦,并且会养成不良的习惯

怎么样,请考虑:

while read folder; do
    files=0
    for files in $folder/*; do
        files=1
        break
    done
    if [ $files -eq 0 ]; then
        echo "$folder" >> output.txt
    else
        echo "not empty: $folder" >&2
    fi
done

代替使用命令替换和管道计数文件,它使用for循环来设置信号灯(如果存在任何文件)。这将总是更快。

请注意,这符合POSIX。如果您的shell是更高级的shell(例如bash或zsh),则可以使用更优雅/有效的选项。