shell脚本:“'<<'无与伦比的“-syntax错误使用此处文档

时间:2014-03-16 18:54:02

标签: 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

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

 syntax error at line 33 : `<<' unmatched

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

1 个答案:

答案 0 :(得分:12)

此处的字符串分隔符不得缩进,您的END应位于该行的开头:

$ cat <<EOT
> foo
>         bar
> EOT
foo
        bar

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

$ cat <<-EOT
>         foo
>         bar
>         quux
>         EOT
foo
bar
quux

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

  

如果重定向符号为“&lt;&lt; - ”,则所有前导选项卡都应从输入行和包含尾随分隔符的行中删除。