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?
中描述的任何工具
刚刚学习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? 中描述的任何工具