5

我有以下文件,并且文件上有 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
4

2 回答 2

7

Heredocs 是很难做到的。如果您使用'EOF'正是结束行所需要的,那么前面没有像您一样的空格。

或者,您可以使用<<-从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

使用该<<-变体可以使文件更整洁,但是如果您当然想保留前导选项卡,那就不好了。从bash手册页:

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

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

touch "$basedirectory$FEATURE_EXT.$SENT_EXT"

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

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

会成功的。

但是,由于 heredoc实际上确实输出了一个空行(一个\n字符),因此您可以选择:

echo >"$basedirectory$FEATURE_EXT.$SENT_EXT"

反而。

于 2013-06-12T03:20:09.853 回答
3

您的 heredocs 的末尾EOF不能有任何空格。删除那些空格。

于 2013-06-12T03:14:00.780 回答