【问题标题】:shell script: "'<<' unmatched"-syntax error using here documentshell 脚本:“'<<' 不匹配”-使用此处文档的语法错误
【发布时间】:2014-03-16 18:54:01
【问题描述】:

您好,我正在尝试编写一个程序,如果感兴趣的人在给定时间上线,它将提醒用户。到目前为止,我的程序是

#!/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

我不确定为什么会出现这种情况。我检查了许多其他示例,并且我的 at 命令(此处为文档)似乎与他们的相同。有人可以帮帮我吗?谢谢。

【问题讨论】:

    标签: shell ksh


    【解决方案1】:

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

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

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

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

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

    如果重定向符号为“

    【讨论】:

    • 谢谢!我刚得到那个!无论如何在对命令本身的调用中有一个分隔符?喜欢在(分隔符)
    • 不确定我是否理解您的问题,需要改写吗?
    • 好吧,我不能缩进命令是否有选项可以为我去掉多余的空格?
    • 这里文档内容可以缩进多少都可以,只是结束分隔符不允许缩进(否则解析器不知道这里文档的结束位置),应该不是问题吗?
    • 我添加了一些关于 command &lt;&lt;-delimiter 的信息,您可能会觉得这些信息对您有所帮助,但请注意,这会影响所有行并且仅适用于制表符。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-17
    • 2012-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-30
    • 1970-01-01
    相关资源
    最近更新 更多