2016-07-06 85 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

爲了擺脫那些你可以使用以下兩種: