erro ./c.sh: linha 24: [: muitos argumentos no programa shell

2

Estou tentando fazer um script de shell para imprimir a quantidade de tempo que o usuário fez login no sistema, mas encontrei um too many arguments error . Eu tentei muitos métodos da internet, mas nenhum funcionou. Alguém pode identificar o erro?

#!/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" 

Saída de 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
    
por identicon 31.07.2015 / 19:42

1 resposta

4

Você está assumindo que a saída de who | grep jeevansai será uma única linha, o que está errado.

++ who
++ grep jeevansai
++ cut -c 32-34
+ ld='31 
31 '

Isso está lhe dizendo que o comando

ld='who | grep "jeevansai" | cut -c 32-34'

defina a variável ld para " 31 31 ", em vez de um único número, como você esperava. Mais tarde, você tenta fazer matemática ...

if [ $ld -gt $cd ]

... expande para ...

if [ 31 31 -gt 31 ]

e isso é muitos argumentos para [ .

O que você precisa fazer é tomar o mínimo de todas as datas que retornam de who . Infelizmente, a aritmética de datas não é fácil no shell (observe que seu programa atualmente ignora o campo de mês). Eu pessoalmente procuraria por Perl ou Python.

EDIT: Para qualquer um que esteja se perguntando por que who imprime mais de uma linha de saída para um único usuário: em uma moderna estação de trabalho Unix (inclusive OSX) todas as janelas do shell que você abrir geralmente terão sua própria entrada, porque cada janela do shell aloca um pseudoterminal , e o banco de dados utmp que who usa, conta cada terminal ativo (pseudo ou caso contrário) como seu próprio login. Da mesma forma, screen e tmux alocarão um pseudo-terminal para cada painel. Você também pode ter uma entrada de utmp para toda a sessão gráfica. Tudo isso foi projetado na década de 1970 e não mudou muito desde então. Por exemplo, aqui está o que parece no meu Mac quando tenho duas janelas de shell abertas:

$ who
zwol     console  Aug 18 09:59 
zwol     ttys000  Aug 19 09:49 
zwol     ttys001  Aug 19 10:35 
    
por 31.07.2015 / 20:22