【问题标题】:Bash script for deleting multiple users based upon date and UID用于根据日期和 UID 删除多个用户的 Bash 脚本
【发布时间】:2014-05-10 20:32:47
【问题描述】:

我正在编写一个 bash 脚本,该脚本根据创建日期和用户 ID 两件事来删除用户。如果日期早于终端中给出的日期并且用户 ID 大于 1000,则应从系统中删除用户。我写了一些代码,它给了我很多问题,因为包含用户名、创建日期和 ID 信息的文件需要拆分或“剪切”。有没有比我将碎片分解成数组更好的方法来解决这个问题?

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

【问题讨论】:

标签: arrays bash split cut


【解决方案1】:

您确实应该从小处着手,然后逐个测试每个语句,然后再添加更多语句。以下是您的代码存在的一些问题:

  1. 您正在使用 for 和 while 循环的奇怪组合。
  2. IFS="/t" 似乎试图将 IFS 设置为选项卡。这应该是IFS=$'\t'
  3. ${array[0]}="$username" 不是有效的分配。你应该使用array[0]="$username",虽然我不确定你为什么首先将它分配给一个数组。
  4. [$dateForDeletion &lt; $date] 不是有效的条件/命令。它应该是[[ $dateForDeletion &lt; $date ]](假设日期是 yyyy-mm-dd 格式或可以作为字符串比较的格式)。
  5. [uid &gt; 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"

【讨论】:

    猜你喜欢
    • 2021-02-21
    • 1970-01-01
    • 2015-07-06
    • 1970-01-01
    • 1970-01-01
    • 2013-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多