Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Bash script: syntax error: unexpected end of file [duplicate]

Tags:

bash

I have the following file and I have chmod a+x on the file. When I try to run it, I get a line 75: syntax error: unexpected end of file. What is the error with my script? What do I need to do to fix it?

#!/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
like image 491
chuacw Avatar asked Jun 12 '13 03:06

chuacw


2 Answers

Heredocs are tricky beasts to get right. If you use 'EOF' that's exactly what the closing line needs to be, with no whitespace at the front like you have.

Alternatively, you can use the <<- variant which strips off all leading tab characters from the lines in the heredoc and the closing line as per the following transcript (where <tab> is the TAB character):

pax> cat <<-'eof'
...> 1
...< 2
...> <tab>eof
...> 4
...> eof

1
2
<tab>eof
4

pax> cat <<-'eof'
...> 1
...> 2
...> <tab>eof

1
2

Using the <<- variant allows for neater files, thoug it's no good if you want to preserve leading tabs of course. From the bash manpage:

If the redirection operator is <<-, then all leading tab characters are stripped from input lines and the line containing delimiter. This allows here-documents within shell scripts to be indented in a natural fashion.

Of course, if you're just wanting to use those files as flag files, there's a better way than cat with a heredoc. Just use:

touch "$basedirectory$FEATURE_EXT.$SENT_EXT"

This will create the file if it doesn't exist and update the modification time if it does, just like the cat but without messing about with heredocs. It won't empty the file but, if you need that for some reason:

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

will do the trick.

However, since the heredoc does actually output a single empty line (one \n character), you can opt for:

echo >"$basedirectory$FEATURE_EXT.$SENT_EXT"

instead.

like image 127
paxdiablo Avatar answered Sep 22 '22 14:09

paxdiablo


The end of your heredocs EOF can not have any whitespace in front of them. Remove those spaces.

like image 42
Joe Frambach Avatar answered Sep 22 '22 14:09

Joe Frambach