Bash 语法错误

Bash syntax error

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

下面的脚本通过 ShellCheck 运行良好,但我从命令行运行 bash 收到语法错误

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

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

Script:

#!/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=""
MOUNT_DIR=""
DEVICE=""  # 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

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

正如在评论中发现的那样,您有一个 Windows (DOS) 文件,然后可以在 UNIX 机器上运行。这有一个问题,即 DOS 中的行结尾是 \r\n,而在 UNIX 中是 \n,因此每行都有一个多余的 \r

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

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