Bash

錯誤 ./c.sh: line 24: [: too many arguments in shell program

  • August 19, 2015

我正在嘗試製作一個 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

您假設 的輸出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將每個活動終端(偽或其他)計為自己的登錄。同樣,screen並且tmux將為每個窗格分配一個偽終端。您可能還有一個用於整個圖形會話的 utmp 條目。所有這些東西都是在 1970 年代設計的,從那以後就沒有太大變化。例如,當我打開兩個 shell 視窗時,這就是我的 Mac 上的樣子:

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

引用自:https://unix.stackexchange.com/questions/219525