嗨我正在尝试编写一个程序,如果有兴趣的人在给定时间上线,该程序将提醒用户.到目前为止,我的计划是
#!/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:
如果重定向符号为"<< - ",则应从输入行和包含尾随分隔符的行中去除所有前导选项卡.