我有以下文件,我在文件上有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
答案 0 :(得分:6)
Heredocs是一个棘手的野兽,为了正确。如果你使用完全 那么结束行需要的是什么,前面没有像你一样的空格。
或者,您可以使用'EOF'
变体,根据以下记录({{1}除去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
联机帮助页:
如果重定向运算符为
<<-
,则从输入行和包含分隔符的行中删除所有前导制表符。这允许shell脚本中的文档以自然的方式缩进。
当然,如果您只是想将这些文件用作标记文件,那么使用heredoc的方法比bash
更好。只需使用:
<<-
如果文件不存在,这将创建文件并更新修改时间,就像cat
一样,但不会弄乱heredocs。它不会清空文件,但是,如果您出于某种原因需要它:
touch "$basedirectory$FEATURE_EXT.$SENT_EXT"
会做到这一点。
但是,由于heredoc 确实实际输出一个空行(一个cat
个字符),您可以选择:
rm -f "$basedirectory$FEATURE_EXT.$SENT_EXT"
touch "$basedirectory$FEATURE_EXT.$SENT_EXT"
代替。
答案 1 :(得分:1)
你的heredocs EOF
的结尾不能有任何空格。删除这些空格。