shell脚本:"'<<'无法比拟"-syntax错误使用here here

cog*_*gle 4 shell ksh

嗨我正在尝试编写一个程序,如果有兴趣的人在给定时间上线,该程序将提醒用户.到目前为止,我的计划是

#!/usr/bin/ksh
message=""
when=""
validFiles=""
validUsers=""

if [ $# -gt 0 ] ; then
    while getopts w:m: opt
    do
        case $opt in
        w) when=$OPTARG;;
        m) message=$OPTARG;;
        \?) echo $USAGE exit 2;;
        esac
    done
    shift $(($OPTIND - 1))
    if [[ $# -gt 0 ]] ; then
        for i; do
            if [[ -f "$i" && -r "$i" ]]; then
                if ! echo $validFiles | grep $i >/dev/null; then
                    validFiles="$validFiles $i"
                fi
            elif id $i 2> /dev/null 1>&2; then
                if ! echo $validUsers | grep $i > /dev/null; then
                    validUsers="$validUsers $i"
                fi
            fi
        done
        if [[ $when != "" && $validFiles != "" || $validUsers != "" ]] ;then
            for i in $validUsers; do
                if ! grep $i $validFiles >/dev/null; then
                    at $when <<"END"
                        if finger $i | grep $i; then
                            echo "$i is online" | elm $message
                        fi
                    END
                fi
            done
        fi
    else
        echo "No files or usernames"
    fi
else
    echo "No arguments provided"
fi
Run Code Online (Sandbox Code Playgroud)

我的问题是,当我尝试运行此操作时,我收到错误消息

 syntax error at line 33 : `<<' unmatched
Run Code Online (Sandbox Code Playgroud)

我不确定为什么会出现这种情况.我已经检查了许多其他的例子,我的命令,这里的文件,似乎与他们的相同.有人可以帮帮我吗?谢谢.

Adr*_*rth 12

这里的字符串分隔符不能缩进,你END应该在行的开头:

$ cat <<EOT
> foo
>         bar
> EOT
foo
        bar
Run Code Online (Sandbox Code Playgroud)

如果您希望缩进尾随分隔符,您可以使用以下语法,但这也将从here文档本身中删除所有前导选项卡(这仅适用于选项卡!):

$ cat <<-EOT
>         foo
>         bar
>         quux
>         EOT
foo
bar
quux
Run Code Online (Sandbox Code Playgroud)

请注意,此行为由POSIX指定,因此应适用于所有兼容的shell:

如果重定向符号为"<< - ",则应从输入行和包含尾随分隔符的行中去除所有前导选项卡.