2013-06-12 54 views
4

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

#!/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 "[email protected]$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 

回答

6

Heredocs是棘手的野兽得到正确的。如果你使用'EOF'那就是,正好是闭合线需要的东西,没有像前面那样的空白。

或者,也可以使用<<-变体,其从在所述定界符线剥去所有前导制表符收线按照以下转录物(其中<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 

使用<<-变种允许整洁的文件,如果你想保留前导标签当然是不好的。从bash手册页:

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.

当然,如果你只是想用这些文件为标志的文件,还有比cat用定界符更好的办法。只需使用:如果不存在,如果它不更新修改时间,就像cat但没有摆弄here文档

touch "$basedirectory$FEATURE_EXT.$SENT_EXT" 

这将创建该文件。它不会文件,但是,如果你需要,由于某些原因:

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

会做的伎俩。

然而,由于定界符确实实际输出一个空行(一个\n字符),你可以选择:

echo >"$basedirectory$FEATURE_EXT.$SENT_EXT" 

代替。

+0

谢谢,paxdiablo!你最懂我心!我实际上是在用猫创造一面旗帜!即使在删除猫之后,我仍然遇到语法问题,并且一触即发。 – chuacw

+0

@chuacw,然后问另一个问题。这里没有配额制度:-) – paxdiablo

+0

LOL,我成功了。犯一个愚蠢的错误。谢谢paxdiablo! – chuacw

1

您here文档EOF年底不能在他们面前的任何空白。删除这些空间。

相关问题