for循环的多个变量

时间:2014-04-26 06:16:20

标签: mysql bash for-loop awk

我正在尝试从文件中将用户添加到系统中。该文件看起来完全像这样:

user@domain.com password 1
user2@domain.com baddpassword 2

这些数字是他们的ID。它来自一个mysql数据库,我需要对这些变量做一些事情,所以我需要4个变量。 USER,PASS,FIRSTID(1)和LASTID(在这种情况下是mysql转储的最后一个ID,2。这一次考虑超过2个条目)

到目前为止,我所拥有的是:

for USER in `cat /root/users_w_pass | sed -n '1!p' | awk -F@ '{print $1}'`
do
    for PASS in `cat /root/users_w_pass | sed -n '1!p' | awk -F ' ' '{print $2}'`
    do
        useradd $USER -d /home/$USER -m -s /home/$USER.sh
        echo "$USER:$PASS" | chpasswd
    done
done`

当运行这个时,密码不会被添加到相应的用户,我不知道我应该怎么做,因为我认为它会起作用,但我可以看到它没有。此外,我需要做的不仅仅是将它们添加到系统中,我正在创建文件并为每个文件分配ACL,因此在文件上运行newusers将不起作用,特别是有第三列作为好。

1 个答案:

答案 0 :(得分:0)

仅使用bash

while read email password trash; do
    user=${email%%@*}
    useradd "$user" -d "/home/$user" -m -s "/home/$user.sh"
    echo "$user:$password" | chpasswd
done < your_file.txt

或(即使我更喜欢第一种解决方案):

while read; do
    set -- "$REPLY"
    user=${1%%@*}
    password=$2
    useradd "$user" -d "/home/$user" -m -s "/home/$user.sh"
    echo "$user:$password" | chpasswd
done < your_file.txt

如果你想过滤第一行,这是一个解决方案:

i=0
while read email password trash; do
    if [[ $i -ne 0 ]]; then
        user=${email%%@*}
        useradd "$user" -d "/home/$user" -m -s "/home/$user.sh"
        echo "$user:$password" | chpasswd
    fi
    (( i++ ))
done < your_file.txt

在这种情况下无需同时使用awksed,也绝不使用for i in $(command)see this answer