【问题标题】:Syntax error: "then" unexpected (expecting "done")语法错误:“then”意外(预期“done”)
【发布时间】:2019-01-27 10:59:44
【问题描述】:

这是我的问题陈述。

编写一个将文件夹名称作为命令行参数的 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")

我的脚本有什么问题吗?

【问题讨论】:

  • 尝试删除第 6 行,这就是问题所在。
  • @HenslerSoftware 仍然无法正常工作!不过谢谢你的建议!
  • 任何时候遇到shell问题,第一步应该是分析shellcheck.net中的脚本并修复它报告的问题。如果这样做之后你的脚本仍然不起作用,是时候发布到 StackOverflow。

标签: shell


【解决方案1】:

别忘了,在 shell 中,[ 是一个接受参数并返回真或假(0 或 1)的二进制文件。
if 是一个关键字,用于验证调用的下一个二进制文件的返回是否为真( 0).

所以,当你这样做时

if[$files -eq 0]

你的shell什么都不懂,因为它试图启动if[2程序,然后他在没有检测到if的情况下找到了then
为了解决您的问题,您必须在 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

【讨论】:

    【解决方案2】:

    试试这样的

    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
    

    注意没有空格 files=..,并且有 `(back tick) not '(单引号)

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

    【讨论】:

    • 感谢您的提示。由于 if 之后缺少空间,我面临这个问题。在 if 和左大括号之间添加空格,脚本执行成功。
    【解决方案3】:

    可能存在间距错误:

    只需执行 2 个步骤:

    1. 运行hexdump -C yourscript.sh
    2. 运行cat yourscript.sh | tr -d '\r' >> yournewscript.sh

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

    【讨论】:

      【解决方案4】:

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

      • 当您设置$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 是更高级的,例如 bash 或 zsh,那么您可以使用更优雅/高效的选项。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-07-14
        • 2022-09-23
        • 1970-01-01
        • 2016-06-04
        • 2016-05-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多