2014-05-10 51 views
0

我正在研究一個bash腳本,該腳本根據創建日期和用戶標識兩個方面來刪除用戶。如果日期在終端中給出的日期之前,並且用戶ID大於1000,則應從系統中刪除該用戶。我寫了一些代碼,它給了我很多問題,因爲用戶名,創建日期和ID需要拆分或「剪切」該文件。有沒有更好的方法去解決這個問題,然後我們將它們分解成一個數組?根據日期和UID刪除多個用戶的Bash腳本

#!/bin/bash 

if [ $# -eq 0 ] ; then 
     echo $0 "<date(year/month/day) filename>" 
     exit 1 
fi 

dateForDeletion=$1 
listOfUsers=$2 

for i in `cat $listOfUsers` | while IFS='/t' read username date; do 
     ${array[0]}="$username" 
     ${array[1]}="$date" 
     uid=`id -u ${array[0]}` 
     if [$dateForDeletion < $date] && [uid > 1000] ; then 
       `sudo userdel $username` 
     fi 
done 
+0

請你幫個忙,並閱讀[Bash的陷阱(http://mywiki.wooledge.org/BashPitfalls) – Creek

回答

1

你真的應該開始縮小並建立起來,在添加更多內容之前單獨測試每條語句。以下是您的代碼的一些問題:

  1. 您正在使用for和while循環的奇怪合併。
  2. IFS="/t"似乎試圖將IFS設置爲選項卡。這應該是IFS=$'\t'
  3. ${array[0]}="$username"不是有效的分配。你應該使用array[0]="$username",不過我不確定你爲什麼要把它分配給一個數組。
  4. [$dateForDeletion < $date]不是有效的條件/命令。它應該是[[ $dateForDeletion < $date ]](假設日期是yyyy-mm-dd格式或可以作爲字符串比較的東西)。
  5. [uid > 1000]不是有效的條件/命令。它應該是[ "$uid" -gt 1000 ]
  6. `sudo userdel $username`不應該反引號。

這裏是你的循環應該是什麼樣子:

while IFS=$'\t' read -r username date 
do 
    uid=$(id -u "$username") 
    if [[ $dateForDeletion < $date && $uid -gt 1000 ]] 
    then 
    sudo userdel "$username" 
    fi 
done < "$listOfUsers"