2016-07-06 53 views
3

只学习bash并试图在脚本中实现函数。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 

代码的一部分,但它似乎没有什么区别。

+4

描述的工具,你可能有一个DOS文件在UNIX中运行。尝试运行'dos2unix'来“清除”它 – fedorqui

+0

我在Windows上使用Textpad进行编辑,然后通过ftp进行编辑。所以如果我只是使用sudo nano来清理它? – dbmitch

+0

不是,因为Windows有不同的行结尾。只需使用工具'dos2unix'(或其他在[Windows命令转换Unix行结束?](http://stackoverflow.com/q/17579553/1983854))中可以取代那些。 – fedorqui

回答

2

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

为了摆脱那些你可以使用以下两种: