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 の引数を 1 つ取ります。w 値は at ジョブの時間として設定されますが、m は引き続き使用する必要があります。m の後の引数は Search_List というファイルに送信され、Search_List は編集されて Usr_List として保存されます。次に while ループで、Usr_List が空でない間、スクリプトは finger -m の結果を Usr_List の名前と照合します。名前が見つかった場合は、Usr_List から削除されます。Usr_List が空になると、プログラムは停止します。

elm は電子メールを送信する方法なので、elm ユーザーはユーザーに電子メールを送信します。

エラーは次のとおりです。

while: 式の構文

4

4 に答える 4

0

-kオプションをat次のように渡す必要があります。

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

atcshそれ以外の場合は、またはその派生物の 1 つであるログイン シェルにデフォルト設定されます。

于 2013-03-17T23:43:59.470 に答える
0

at はデフォルトで /bin/sh を使用します。

at  now <<ENDMARKER

 <code here>

ENDMARKER

これらはすべて /bin/sh の下で実行され、一部のシステムでは Bourne Shell (たとえば、Solaris) で実行されます。システムの /bin/sh が何であるかを把握し、それに応じて変更する必要があります。さらに、「at」環境に何があり、何がないかについての保証を読んでください。問題はそこにあると思います。UNIX と Linux の両方のタグがあります。だから私はそれ以上の助けを与えることはできません。

at コード チャンクのロギングを有効にできます (必要な方法で):

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

次に、デバッグ メッセージを stdout または stderr に書き込みます。

于 2013-03-17T23:35:47.953 に答える
0

HEREDOC が補間されています。区切り文字を引用してみてください:

at $wval << 'ENDMARKER'

(詳しくは見ていませんが)補間が必要なようです。しかし、あなたが参照する行にそれを絶対に入れたくないので、ヒアドキュメント全体を引用しない場合は次$iのように引用してください。$

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

while コマンドと if コマンドを組み合わせる必要があることがわかりました。

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