Bash
錯誤 ./c.sh: line 24: [: too many arguments in shell program
我正在嘗試製作一個 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