Bash脚本:语法错误:意外的文件结束

时间:2013-06-12 03:09:07

标签: bash

我有以下文件,我在文件上有chmod a + x。 当我尝试运行它时,我得到第75行:语法错误:意外的文件结束。我的脚本有什么错误?我需要做些什么来解决它?

#!/bin/sh
# log directory for ascp transfer
logdirectory=/tmp/log20079
# log for this script
baselog=$logdirectory/sent4files.log
#directory of where the files to be transferred are located
basedirectory=/tmp/test20079/

#remote host data
REMOTE_DIR=/Upload
REMOTE_HOST=xxx
REMOTE_USER=xxx
# extensions of file
FEATURE_EXT=feature
KEYART_EXT=keyart
TRAILER_EXT=trailer
METADATA_EXT=metadata

# files to be excluded, must match exclude_file_suffix
COMPLETE_EXT=complete
SENT_EXT=sent

# file to send on completion
FILE_ON_COMPLETE="$basedirectory"delivery.complete

if [ "$TYPE" == "File" ]; then
   if [ "$STARTSTOP" == "Stop" ]; then
     if [ "$STATE" == "success" ]; then
        filename=$(basename "$FILE")
        extension="${filename##*.}"

# check the extension here, and create files ending in .sent as a flag

        case "$extension" in

        "$FEATURE_EXT")
           cat > "$basedirectory$FEATURE_EXT.$SENT_EXT" << 'EOF'
           EOF
           echo "Feature sent" >> $baselog
            ;;
        "$KEYART_EXT")
           cat > "$basedirectory$KEYART_EXT.$SENT_EXT" << 'EOF'
           EOF
           echo "Keyart sent" >> $baselog
            ;;
        "$TRAILER_EXT")
           cat > "$basedirectory$TRAILER_EXT.$SENT_EXT" << 'EOF'
           EOF
           echo "Trailer sent" >> $baselog
            ;;
        "$METADATA_EXT")
           cat > "$basedirectory$METADATA_EXT.$SENT_EXT" << 'EOF'
           EOF
           echo "Metadata sent" >> $baselog
           ;;
        esac


# check that all four files exists
        if [ -e "$basedirectory$FEATURE_EXT.$SENT_EXT" ] && [ -e "$basedirectory$KEYART_EXT.$SENT_EXT" ] && [ -e "$basedirectory$TRAILER_EXT.$SENT_EXT" ] && [ -e "$basedirectory$METADATA_EXT.$SENT_EXT" ]; then
          echo "All files sent" >> $baselog
          echo>$FILE_ON_COMPLETE
#         $FILE_ON_COMPLETE "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR"
          rm "$basedirectory$FEATURE_EXT.$SENT_EXT"
          rm "$basedirectory$KEYART_EXT.$SENT_EXT"
          rm "$basedirectory$TRAILER_EXT.$SENT_EXT"
          rm "$basedirectory$METADATA_EXT.$SENT_EXT"
          rm $FILE_ON_COMPLETE
        fi

     fi
   fi
fi

2 个答案:

答案 0 :(得分:6)

Heredocs是一个棘手的野兽,为了正确。如果你使用完全 那么结束行需要的是什么,前面没有像你一样的空格。

或者,您可以使用'EOF'变体,根据以下记录({{1}除去heredoc 中的行中的所有前导制表符。是 TAB 字符):

<<-

使用<tab>变体允许更整洁的文件,如果你想保留主要标签,那就不好了。来自pax> cat <<-'eof' ...> 1 ...< 2 ...> <tab>eof ...> 4 ...> eof 1 2 <tab>eof 4 pax> cat <<-'eof' ...> 1 ...> 2 ...> <tab>eof 1 2 联机帮助页:

  

如果重定向运算符为<<-,则从输入行和包含分隔符的行中删除所有前导制表符。这允许shell脚本中的文档以自然的方式缩进。

当然,如果您只是想将这些文件用作标记文件,那么使用heredoc的方法比bash更好。只需使用:

<<-

如果文件不存在,这将创建文件并更新修改时间,就像cat一样,但不会弄乱heredocs。它不会清空文件,但是,如果您出于某种原因需要它:

touch "$basedirectory$FEATURE_EXT.$SENT_EXT"

会做到这一点。

但是,由于heredoc 确实实际输出一个空行(一个cat个字符),您可以选择:

rm -f "$basedirectory$FEATURE_EXT.$SENT_EXT"
touch "$basedirectory$FEATURE_EXT.$SENT_EXT"

代替。

答案 1 :(得分:1)

你的heredocs EOF的结尾不能有任何空格。删除这些空格。