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

ヒアドキュメントは正しく理解するのが難しい動物です。使用する場合は'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

リダイレクト演算子が の場合、<<-先頭のすべてのタブ文字が入力行と区切り文字を含む行から削除されます。これにより、シェルスクリプト内のヒアドキュメントを自然な方法でインデントできます。

もちろん、これらのファイルをフラグ ファイルとして使用したいだけであればcat、ヒアドキュメントを使用するよりも優れた方法があります。使用するだけです:

touch "$basedirectory$FEATURE_EXT.$SENT_EXT"

これにより、ファイルが存在しない場合はファイルが作成され、存在する場合は変更時刻が更新されますが、catヒアドキュメントをいじることはありません。ファイルを空にすることはありませんが、何らかの理由でそれが必要な場合:

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

トリックを行います。

ただし、ヒアドキュメント実際には 1 行の空行 (1\n文字) を出力するため、次のオプションを選択できます。

echo >"$basedirectory$FEATURE_EXT.$SENT_EXT"

代わりは。

于 2013-06-12T03:20:09.853 に答える