【问题标题】:Bash script: syntax error: unexpected end of file [duplicate]Bash脚本:语法错误:文件意外结束[重复]
【发布时间】:2013-06-08 01:39:12
【问题描述】:

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

【问题讨论】:

    标签: bash


    【解决方案1】:

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

    或者,您可以使用&lt;&lt;- 变体,该变体从heredoc 中的行中去除所有前导制表符,根据以下成绩单(其中&lt;tab&gt; 是TAB 字符):

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

    使用&lt;&lt;- 变体可以使文件更整洁,但是如果您想保留前导标签当然是不好的。来自bash 联机帮助页:

    如果重定向操作符是&lt;&lt;-,那么所有前导制表符都会从输入行和包含分隔符的行中去除。这允许 shell 脚本中的 here-documents 以自然的方式缩进。

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

    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"
    

    改为。

    【讨论】:

    • 谢谢,paxdiablo!你最懂我心!我实际上是在使用 cat 来创建一个标志!即使在删除 cat 并用 touch 替换后,我仍然遇到语法问题。
    • @chuacw,然后再问一个问题。这里没有配额系统:-)
    • 大声笑,我成功了。犯一个愚蠢的错误。谢谢paxdiablo!
    • 另外,使用 bash here-string 代替 here-doc:cat &gt; file &lt;&lt;&lt; ""
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-31
      • 2011-09-16
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      相关资源
      最近更新 更多