【问题标题】:Why this 'syntax error' before 'else'?为什么在“else”之前出现这个“语法错误”?
【发布时间】:2013-04-01 13:57:13
【问题描述】:

我正在编写一个 shell 脚本来解压缩目录中的文件。不同的zip文件中存在同名文件;代码必须保留较大的。

我需要解压缩 /test 目录中的文件。有数千个 zip 文件,我没有空间同时解压缩它们。因此,我创建了一个文件夹 /test/tmp 并将一个 zip 文件解压缩到该文件夹​​中。然后比较 /test 和 /test/tmp 文件夹中的文件。如果有重复文件,比较它们的大小并将较大的文件保留在 /test 中。如果没有重复,将文件从 /test/tmp 移动到 /tmp。

这是我的代码:

#!/bin/bash
A="/test"
B="/test/tmp"
archives=$(ls $A *.zip 2>/dev/null)
for archive in "${archives}"  
do
    mkdir -p "${B}" && unzip "${archive}" -d $B
    for file_tmp in 'ls $B *.log 2>/dev/null'
    do
        file_root="${A}${file_tmp}"
        if [-f "${file_root}"] then
            if [[$(stat -c %s "${file_tmp}") -ge $(stat -c %s "${file_root}")]]
            then mv "${file_tmp}" "${file_root}"
            else rm "${file_tmp}"
            fi 
        else mv "${file_tmp}" $A
        fi
    done
done

但我不断收到错误

unziptest.sh: line 16: syntax error near unexpected token `else'
unziptest.sh: line 16: `            else mv "${file_tmp}" $A'

怎么了?

【问题讨论】:

    标签: linux bash shell size unzip


    【解决方案1】:

    如果你要使用单行,那么:

    if [-f "${file_root}"] then
    

    then前必须有一个分号:

    if [ -f "${file_root}" ]; then
    

    您还需要命令名称[ 周围的空格,以及[ 命令的最后一个参数] 之前的空格。如果您使用[[ 表示法,那么间距就不那么重要了。

    【讨论】:

    • 我改变了那些地方,我的代码现在可以运行了。但我无法得到我想要的结果。你能帮我做事吗?
    • “无法得到我想要的结果”是什么意思?它是如此不精确,以至于无法回答。我建议通过运行sh -x yourscript 单步执行代码并查看它的作用以及出错的地方。我会确保我也能看到每一个中间值。例如,我可能会将两个stat -c 命令的输出捕获到变量中,然后比较变量。
    • 与这一切不同的是,for file_tmp in 'ls $B *.log 2>/dev/null' 行不运行ls 命令,因为您使用单引号而不是反引号或$(...)。您需要:for file_tmp in $(ls $B *.log 2>/dev/null)。但仍然存在问题;你得到目录$B 的内容(没有任何路径名),你得到当前目录中的所有日志文件。这可能不是您的想法。也许你需要一个斜线:for file_tmp in $(ls $B/*.log 2>/dev/null)。如果您使用sh -x 运行,您会注意到这一点。
    • 看来shell有文件变量和文件名变量。我可以通过'for archive in *.zip do unzip -d $B "./$archive" done'将每个文件解压到目录中。而不是 'archives=$(ls $A *.zip 2>/dev/null) 用于 "${archives}" 中的存档 do mkdir -p "${B}" && unzip "${archive}" -d $乙'。我遵循互联网上的所有示例代码并合成此代码。每个查询单独工作正常。但我无法用整个脚本实现我的目标。
    • 发现错了,我把''误用为``,shell里有这么多花样~~~~lol
    【解决方案2】:

    更改if [-f "${file_root}"] then

    if [-f "${file_root}"]
    then
    

    if [-f "${file_root}"] ; then
    

    【讨论】:

    • 谢谢,我改变了那些地方,代码现在运行。但它根本无法解压缩文件。我是 Shell/bash 的新手。你能帮我让代码工作吗?我需要用空格处理 zip 文件名。
    • 请注意,您的更改是必要的;然而,这还不够。很少有系统有一个名为[-f 的命令;您需要在[-f 之间留一个空格来调用[(又名test)命令(它通常以/bin/[/usr/bin/[ 或两者的形式存在)。 [ 的最后一个参数必须是 ],所以你也需要一个空格。
    猜你喜欢
    • 2015-10-13
    • 1970-01-01
    • 2019-11-25
    • 2019-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-28
    相关资源
    最近更新 更多