错误 ./c.sh: 第 24 行: [: shell 程序中的参数太多

错误 ./c.sh: 第 24 行: [: shell 程序中的参数太多

我正在尝试制作一个 shell 脚本来打印用户登录系统的时间,但我遇到了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

答案1

您假设 的输出who | grep jeevansai将是一行,这是错误的。

++ 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。不幸的是,日期算术在 shell 中并不容易(请注意,您的程序当前完全忽略月份字段)。我个人会选择 Perl 或 Python。

编辑:对于任何可能想知道的人为什么 who为单个用户打印多行输出:在现代 Unix 工作站(包括 OSX)上你打开的每个 shell 窗口通常会得到自己的条目,因为每个 shell 窗口都会分配一个伪终端,以及utmp使用的数据库who将每个活动终端(伪终端或其他终端)计为自己的登录名。同样,screenandtmux将为每个窗格分配一个伪终端。您可能还拥有整个图形会话的 utmp 条目。所有这些东西都是 20 世纪 70 年代设计的,此后就没有太大改变。例如,当我打开两个 shell 窗口时,它在我的 Mac 上看起来如下:

$ who
zwol     console  Aug 18 09:59 
zwol     ttys000  Aug 19 09:49 
zwol     ttys001  Aug 19 10:35 

相关内容