ユーザーがシステムにログインした時間を出力するシェルスクリプトを作成しようとしていますが、too many arguments error
が発生しました。私はインターネットから多くの方法を試しましたが、どれもうまくいきませんでした。誰かが間違いを見つけることができますか?
#!/bin/bash
lt=`who | grep "jeevansai" | cut -c 35-39`
lh=`echo $lt | cut -c 1-2`
lm=`echo $lt | cut -c 4-5`
ld=`who | grep "jeevansai" | cut -c 32-34`
ch=`date +%H`
cm=`date +%M`
cd=`date +%d`
fun()
{
if [ $cm -gt $lm ]
then
{
sm=`expr $cm - $lm`
sh=`expr $ch - $lh`
}
else
{
sm=`expr 60 - $lm - $cm`
sh=`expr $ch - $lh - 1`
}
fi
exit 1
}
if [ $ld -gt $cd ]
then
{
if [ $ch -gt $lh ]
then
{
fun
}
else
{
sh=`expr 24 - $lh + $ch`
sm=`expr 60 - $lm + $cm`
}
fi
}
else
fun
fi
echo "$sh hr $sm min"
bash -x c.sh
の出力:
++ who
++ grep jeevansai
++ cut -c 35-39
+ lt='22:27
23:18'
++ echo 22:27 23:18
++ cut -c 1-2
+ lh=22
++ echo 22:27 23:18
++ cut -c 4-5
+ lm=27
++ who
++ grep jeevansai
++ cut -c 32-34
+ ld='31
31 '
++ date +%H
+ ch=23
++ date +%M
+ cm=24
++ date +%d
+ cd=31
+ '[' 31 31 -gt 31 ']'
c.sh: line 24: [: too many arguments
+ fun
+ '[' 24 -gt 27 ']'
++ expr 60 - 27 - 24
+ sm=9
++ expr 23 - 22 - 1
+ sh=0
+ exit 1
who | grep jeevansai
の出力が1行になると想定していますが、これは誤りです。
++ who
++ grep jeevansai
++ cut -c 32-34
+ ld='31
31 '
これは、コマンドが
ld=`who | grep "jeevansai" | cut -c 32-34`
変数ld
を、期待した単一の数値ではなく、「31 31
」に設定します。後で、あなたはそれに数学をしようとします...
if [ $ld -gt $cd ]
...に展開します...
if [ 31 31 -gt 31 ]
[
に対する引数が多すぎます。
あなたがする必要があるのは、who
から戻ってくるすべての日付の最小を取ることです。残念ながら、シェルでは日付の計算は簡単ではありません(現在、プログラムは月のフィールドを完全に無視していることに注意してください)。私は個人的にPerlまたはPython)に手を伸ばします。
編集:疑問に思う人のためになぜwho
は複数行を出力する単一ユーザーの出力の例:最新のUnixワークステーション(OSXを含む)では、開いているすべてのシェルウィンドウは通常、独自のエントリを取得します。これは、各シェルウィンドウが 疑似端末 、およびutmp
が使用する who
データベースは、各アクティブ端末(疑似端末またはその他)を次のようにカウントします。独自のログイン。同様に、screen
とtmux
は、各ペインに1つの疑似端末を割り当てます。グラフィカルセッション全体のutmpエントリがある場合もあります。これらはすべて1970年代に設計され、それ以来あまり変更されていません。たとえば、2つのシェルウィンドウを開いたときのMacでの表示は次のとおりです。
$ who
zwol console Aug 18 09:59
zwol ttys000 Aug 19 09:49
zwol ttys001 Aug 19 10:35