![在 for 循环中迭代多个变量](https://linux22.com/image/1406538/%E5%9C%A8%20for%20%E5%BE%AA%E7%8E%AF%E4%B8%AD%E8%BF%AD%E4%BB%A3%E5%A4%9A%E4%B8%AA%E5%8F%98%E9%87%8F.png)
我正在尝试从文件向系统添加用户。该文件看起来完全像这样:
[email protected] password 1
[email protected] baddpassword 2
数字是它们的 ID。它来自 mysql db,我需要对这些变量进行一些操作,所以我需要 4 个变量。USER、PASS、FIRSTID(为 1)和 LASTID(在本例中为 mysql 转储的最后一个 ID,为 2。这是一次考虑超过 2 个条目)
到目前为止我所拥有的是这样的:
for USER in $(awk -F@ 'NR>1 {print $1}' /root/users_w_pass)
do
for PASS in $(awk 'NR>1 {print $2}' /root/users_w_pass)
do
useradd $USER -d /home/$USER -m
echo "$USER:$PASS" | chpasswd
...
done
done
运行此程序时,密码不会添加到相应的用户,我不知道该怎么做,因为我认为它会起作用,但我知道它不起作用。它似乎循环了密码。此外,我正在创建文件并为每个文件分配 ACL,因此newusers
在这里运行文件不起作用,尤其是还有第三列。
答案1
你不想读for
正确的做法是使用while
和read
。read
如果字段由空格(空格和制表符)分隔,则内置命令可以自动解析每行的字段。该-r
选项确保读取时不会解释反斜杠:
while read -r user password id; do
# strip the @domain part from username
user="${user%%@*}"
useradd "$user" -d "/home/$user" -m
echo "$user:$password" | chpasswd
# and so on
done < your_input_file
还要注意,不要使用全大写的变量。$USER
已经保留给你的用户名。