您好我正在尝试编写一个程序,如果感兴趣的人在指定时间上线,该程序将提醒用户。到目前为止,我的计划是
#!/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
我不确定为什么会出现这种情况。我已经检查了许多其他的例子,我的命令,这里的文件,似乎与他们的相同。有人可以帮帮我吗?谢谢。
答案 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; - ”,则所有前导选项卡都应从输入行和包含尾随分隔符的行中删除。