Bash 语法错误

Posted

技术标签:

【中文标题】Bash 语法错误【英文标题】:Bash syntax error 【发布时间】:2016-11-09 03:21:03 【问题描述】:

刚刚学习 bash 并尝试在脚本中实现一个函数。

下面的脚本通过 ShellCheck 运行良好,但是从命令行运行 bash 时出现语法错误

这一定是我定义函数的方式,但我想不出正确的方法——尤其是如果它通过了 ShellCheck

error is on line 24
syntax error near unexpected token `$\r''
`autounload() 

脚本:

#!/bin/bash
# /home/pi/scripts/usb-unloader.sh
#
# Called from SCRIPT_DIR/usb-initloader.sh
# make sure to chmod 0755 on file
#
# UnMounts usb device on /media/<device>
# Logs changes to /var/log/syslog and local log folder
# use tail /var/log/syslog to look at latest events in log
#
# CONFIGURATION
#
LOG_FILE="$1"
MOUNT_DIR="$2"
DEVICE="$3"  # USB device name (from kernel parameter passed from rule)
#
# check for defined log file
if [ -z "$LOG_FILE" ]; then
    exit 1
fi
#
# autounload function to unmount USB device and remove mount folder
#
autounload() 
    if [ -z "$MOUNT_DIR" ]; then
        exit 1
    fi
    if [ -z "$DEVICE" ]; then
        exit 1
    fi

    dt=$(date '+%Y-%m-%d %H:%M:%S')
    echo "--- USB Auto UnLoader --- $dt"

    sudo umount "/dev/$DEVICE"
    sudo rmdir "$MOUNT_DIR/$DEVICE"

    # test that this device isn't already mounted
    device_mounted=$(grep "$DEVICE" /etc/mtab)

    if ! "$device_mounted"; then
        echo "/dev/$DEVICE successfully Un-Mounted"
        exit 1
    fi


autounload >> "$LOG_FILE" 2>&1

这是我开始定义函数的代码部分

#
autounload() 
    if [ -z "$MOUNT_DIR" ]; then
        exit 1
    fi

我尝试将函数移动到调用它的上方和下方,但似乎没有什么区别。

【问题讨论】:

您可能有一个在 UNIX 中运行的 DOS 文件。尝试运行dos2unix 来“清理”它 我在 Windows 上使用 Textpad 进行编辑,然后 ftp 结束。所以如果我只使用 sudo nano 应该清理它? 并非如此,因为 Windows 有不同的行尾。只需使用工具 dos2unix(或在 Windows command to convert Unix line endings? 中看到的其他工具)来替换它们。 谢谢! - 该死的 - 应该在一小时前问的! - 把它放在答案中,我会标记它。这对我来说是一个陡峭的学习曲线。 这在bash tag info 中有介绍。 【参考方案1】:

正如在 cmets 中发现的那样,您有一个 Windows (DOS) 文件,该文件随后在 UNIX 机器上运行。这样做的问题是DOS中的行尾是\r\n,而UNIX中的行尾是\n,所以每一行都有一个多余的\r

要摆脱这些,您可以使用以下任一方法:

在 UNIX 中:dos2unix 在 Windows 中:Windows command to convert Unix line endings? 中描述的任何工具

【讨论】:

以上是关于Bash 语法错误的主要内容,如果未能解决你的问题,请参考以下文章

Bash 脚本:意外标记附近的语法错误?

原因:意外标记“fi”附近的 Bash 语法错误

Bash 脚本中的 SQL 语法错误

bash - 意外标记“<”附近的语法错误

AWS CodeBuild buildspec bash 语法错误:用 if 语句替换错误

Bash 脚本中意外标记“if”附近的语法错误