0
#!/usr/dt/bin/dtksh

while getopts w:m: option
do
        case $option in
        w)      wflag=1
                wval="$OPTARG";;
        m)      mflag=1
                mval="$OPTARG";;
        ?)      printf 'BAD\n' $0
                exit 2;;
        esac
done

 if [ ! -z "$wflag" ]; then
printf "W and -w arg is $wval\n"
fi

if [ ! -z "$mflag" ]; then
printf "M and -m arg is $mval\n"
fi

shift $(($OPTIND - 1))
printf "Remaining arguments are: $* \n"

at $wval <<ENDMARKER
echo $* >> Search_List
tr " " "\n" <Search_List >Usr_List

while true; do
        if [ -s Usr_List ]; then
        for i in $(cat Usr_List); do
                if finger -m | grep $i; then
                    echo '$i is online' | elm user
                    sed '/$i/d' <Usr_List >tmplist
                    mv tmplist Usr_List
                fi
        done
        else
        break
        fi
done
ENDMARKER

本质上我想继续搜索直到它是空的。每次找到列表中的元素时,都会将其删除。一旦列表为空退出。

我第一次运行命令时没有错误消息,它只显示在包含 at 作业输出的电子邮件中。

提前感谢您的任何建议

编辑:该脚本使用 getopts 并为 -w 采用一个参数,为 -m 采用一个参数,w 值设置为 at 作业的时间,仍然必须使用 m。m 之后的任何参数都被发送到名为 Search_List 的文件中,Search_List 被编辑并保存为 Usr_List。然后在while 循环中,当Usr_List 不为空时,脚本会根据Usr_List 中的名称检查finger -m 的结果。如果找到名称,则将其从 Usr_List 中删除。一旦 Usr_List 为空,程序应该停止。

elm 是一种发送电子邮件的方式,因此 elm 用户向用户发送电子邮件。

错误是:

while:表达式语法

4

4 回答 4

0

at 默认使用 /bin/sh。

at  now <<ENDMARKER

 <code here>

ENDMARKER

所有这些都在 /bin/sh 下执行,在某些系统上可以是 Bourne Shell(例如 Solaris)。您需要弄清楚 /bin/sh 对您的系统来说是什么,然后相应地进行修改。另外,请阅读有关“在”环境中的内容和不存在内容的保证。我认为问题出在那儿。您同时拥有 UNIX 和 linux 标记。所以我不能提供比这更多的帮助。

您可以启用 at 代码块的日志记录(按照您需要的方式):

exec 2&>1 > /tmp/somefile.log

然后将调试消息写入 stdout 或 stderr。

于 2013-03-17T23:35:47.953 回答
0

您的 HEREDOC 正在被插值。尝试引用分隔符:

at $wval << 'ENDMARKER'

虽然(我没有仔细看)看起来你想要一些插值。但是您绝对不希望它出现在您引用的行上$i,因此$如果您不引用整个heredoc,请引用:

 if finger -m | grep \$i; then
于 2013-03-17T23:37:13.077 回答
0

您需要将-k选项传递给at

...
at -k $wval <<ENDMARKER
...

at否则默认为您的登录外壳,它是csh或其衍生产品之一。

于 2013-03-17T23:43:59.470 回答
0

事实证明,while 命令和 if 命令需要结合使用。

while [[ -s Usr_List ]]; do
    ......
done
于 2013-03-18T19:15:37.697 回答